Как стать автором
Обновить

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

.NET
Перевод
Автор оригинала: 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 Введение.
Теги:.netwpfbindingxaml
Хабы: .NET
Всего голосов 24: ↑21 и ↓3 +18
Просмотры61.1K

Похожие публикации

.NET WPF-разработчик
от 160 000 ₽Exquance SoftwareСанкт-ПетербургМожно удаленно
Программист C#
от 90 000 ₽НПК «Катрен»Новосибирск
C# .Net Developer
от 1 200 до 3 500 $Profit CenterМожно удаленно
.Net разработчик
от 150 000 ₽ArtezioСанкт-Петербург
.Net разработчик
от 150 000 ₽ArtezioСаратов

Лучшие публикации за сутки