28 September 2008

WPF Binding: Что означает {Binding}?

.NET
Translation
Original author: Beatriz Costa
Этой первой статьей я бы хотел начать цикл переводов постов с замечательного блога, в котором Beatriz Costa детально объясняет определенные аспекты Binding'а в WPF. В первом посте затрагивается тема использования Binding'а без указания каких-либо дополнительных свойств.

В основном, Binding'и, которые вы видите в различных примерах, имеют определенные значения свойств Source и Path. Свойство Source определяет объект, на который направляется Binding, а свойство Path определяет свойство у объекта, значение которого вам нужно. Я видела некоторых людей, которых cбивала с толку их первая встреча с пустым Binding'ом — "{Binding}". На первый взгляд кажется, что мы не дали Binding'у нужной информации, чтобы он делал хоть что-нибудь полезное. Но это не так и я объясню почему. Если вы читали мои предыдущие посты, то вы должны понимать, что не обязательно устанавливать свойство Source у Binding'а, так как есть DataContext, объявленный где-то выше по дереву объектов. Так, когда вы хотите указать на весь объект, а не только на какое-то одно его свойство, вы должны опустить свойство Path.

Первый подход, это когда источником выступает строка и вы просто хотите указать на всю строку целиком (а, к примеру, не на ее свойство Length).
  1. <Window.Resources>
  2. <system:String x:Key=”helloString>Hello</system:String>
  3. </Window.Resources>
  4. <Border DataContext=”{StaticResource helloString}”>
  5. <TextBlock TextContent=”{Binding}”/>
  6. </Border>
* This source code was highlighted with Source Code Highlighter.

Другой стандартный подход, это когда вы хотите связать элемент с объектом, у которого есть несколько свойств.
  1. <Window.Resources>
  2. <local:GreekGod Name=”ZeusDescription=”Supreme God of the OlympiansRomanName=”Jupiterx:Key=”zeus/>
  3. </Window.Resources>
  4. <Border DataContext=”{StaticResource zeus}”>
  5. <ContentControl Content=”{Binding}”/>
  6. </Border>
* This source code was highlighted with Source Code Highlighter.

В этой ситуации, ContentControl не знает, как следует отображать данные класса GreekGod. Поэтому, вы всего лишь увидите результат вызова метода ToString(), что обычно немного не то, что нужно. Вместо этого, вы можете использовать DataTemplate, который позволяет вам определять представление ваших данных.
  1. <Window.Resources>
  2. <local:GreekGod Name=”ZeusDescription=”Supreme God of the OlympiansRomanName=”Jupiterx:Key=”zeus/>
  3. <DataTemplate x:Key=”contentTemplate>
  4. <DockPanel>
  5. <TextBlock Foreground=”RoyalBlueTextContent=”{Binding Path=Name}” />
  6. <TextBlock TextContent=”:Margin=”0,0,5,0/>
  7. <TextBlock Foreground=”SilverTextContent=”{Binding Path=Description}” />
  8. </DockPanel>
  9. </DataTemplate>
  10. </Window.Resources>
  11. <Border DataContext=”{StaticResource zeus}”>
  12. <ContentControl Content=”{Binding}” ContentTemplate=”{StaticResource contentTemplate}”/>
  13. </Border>
* This source code was highlighted with Source Code Highlighter.

Заметьте, что у Binding'а внутри DataTemplat'а не определено свойство Source. Это из-за того, что DataContext автоматически устанавливается как Source.


Здесь вы можете найти проект для Visual Studio с кодом, который был использован в статье.

От переводчика:
Автор оригинальной статьи — женщина, поэтому текст перевода написан от женского лица.
Так же хотелось бы узнать, насколько интересна тема Binding'а хабролюдям, и стоит ли продолжать эту серию переводов.
Идея перевода навеяна постом WPF Series: Intro aka Введение.
Tags:.netwpfbindingxaml
Hubs: .NET
+18
59.4k 43
Comments 14
Popular right now
Разработчик .NET
from 60,000 ₽GMCSКазаньRemote job
Разработчик .Net Core
from 90,000 ₽ГК InnoSTageRemote job
.Net Developer
to 250,000 ₽e-POSМоскваRemote job
Разработчик .NET
from 60,000 to 120,000 ₽GMCSТулаRemote job
Ведущий программист .net
from 70,000 to 120,000 ₽Мечел-СервисЧелябинскRemote job