Pull to refresh

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

Reading time 3 min
Views 66K
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.  
  5. <Border DataContext=”{StaticResource helloString}”>
  6.   <TextBlock TextContent=”{Binding}”/>
  7. </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.  
  5. <Border DataContext=”{StaticResource zeus}”>
  6.   <ContentControl Content=”{Binding}”/>
  7. </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.  
  12. <Border DataContext=”{StaticResource zeus}”>
  13.   <ContentControl Content=”{Binding}” ContentTemplate=”{StaticResource contentTemplate}”/>
  14. </Border>
* This source code was highlighted with Source Code Highlighter.

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


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

От переводчика:
Автор оригинальной статьи — женщина, поэтому текст перевода написан от женского лица.
Так же хотелось бы узнать, насколько интересна тема Binding'а хабролюдям, и стоит ли продолжать эту серию переводов.
Идея перевода навеяна постом WPF Series: Intro aka Введение.
Tags:
Hubs:
+18
Comments 14
Comments Comments 14

Articles