Здравствуйте! Не так давно я написал свой первый перевод поста про WPF Binding из блога Beatriz Cost'ы. Он был принят достаточно хорошо, так что я принял решение регулярно, примерно раз в неделю (иногда, возможно, и чаще), переводить по одному посту из этого блога. В этот раз я решил перевести небольшую (на большие пока нет времени) статью, в которой рассказывается о том, в каких ситуациях лучше использовать DataContext, а в каких свойство Source.
Для начала следует сказать, что свойство DataContext — это одна из наиболее фундаментальных концепций в Data Binding'е.
Любому Binding'у нужно откуда-то получать информацию, и для того, чтобы указать ему источник данных, существует несколько способов. В этом посте я расскажу вам о том, как установить свойство Source непосредственно через объект Binding, так и о наследовании DataContext'а от ближайшего вышестоящего элемента в дереве элементов. Так же существует еще два способа. Это установка свойств ElementName и RelativeSource в Binding'e, но я оставлю их для следующих постов.
К примеру, давайте представим, что у нас есть следующий источник данных (класс GreekGod объявлен в коде):
Первый TextBlock наследует DataContext от своего предка — StackPanel, к тому же у него указано свойство Source в его Binding'е. В этой ситуации, свойство Source имеет приоритет. Из-за того, что TextBlock получает данные из свойства Name объекта с ключом «zeus», он отобразит слово «Zeus».
У второго TextBlock'а свойство Source не устанавливается напрямую в объекте Binding. Поэтому он наследует DataContext от вышестоящего StackPanel. Как вы могли догадаться, это укажет на свойство Description у ресурса с ключом «poseidon» и на элементе отобразиться надпись «God of the sea, earthquakes and horses».
С третьим TextBlock'ом все так же, как и со вторым. Он отобразит слово «Neptune».
Большинство использующих Data Binding программ, которые я видела, гораздо чаще используют DataContext, что гораздо сложнее, чем Source. Я рекомендую использовать DataContext только там, где вам надо связать более одного свойства от определенного источника. Когда же связывается только одно свойство, я всегда использую Source. Причина этого в том, что так проще для отладки — для того, чтобы понять, что происходит, я бы предпочла видеть всю информацию о Binding'е в одном месте, а не искать ее в ближайшем DataContext'е. В нашем маленьком примере это несложно, но в больших приложениях это сохранит вам немного времени.

Здесь вы можете найти проект для Visual Studio с кодом, который был использован в статье.
Для начала следует сказать, что свойство DataContext — это одна из наиболее фундаментальных концепций в Data Binding'е.
Любому Binding'у нужно откуда-то получать информацию, и для того, чтобы указать ему источник данных, существует несколько способов. В этом посте я расскажу вам о том, как установить свойство Source непосредственно через объект Binding, так и о наследовании DataContext'а от ближайшего вышестоящего элемента в дереве элементов. Так же существует еще два способа. Это установка свойств ElementName и RelativeSource в Binding'e, но я оставлю их для следующих постов.
К примеру, давайте представим, что у нас есть следующий источник данных (класс GreekGod объявлен в коде):
- <Window.Resources>
- <local:GreekGod Name=”Zeus” Description=”Supreme God of the Olympians” RomanName=”Jupiter” x:Key=”zeus”/>
- <local:GreekGod Name=”Poseidon” Description=”God of the sea, earthquakes and horses” RomanName=”Neptune” x:Key=”poseidon”/>
- </Window.Resources>
-
- <StackPanel DataContext=”{StaticResource poseidon}”>
- <TextBlock TextContent=”{Binding Source={StaticResource zeus}, Path=Name}”/>
- <TextBlock TextContent=”{Binding Path=Description}”/>
- <TextBlock TextContent=”{Binding Path=RomanName}”/>
- </StackPanel>
* This source code was highlighted with Source Code Highlighter.
Первый TextBlock наследует DataContext от своего предка — StackPanel, к тому же у него указано свойство Source в его Binding'е. В этой ситуации, свойство Source имеет приоритет. Из-за того, что TextBlock получает данные из свойства Name объекта с ключом «zeus», он отобразит слово «Zeus».
У второго TextBlock'а свойство Source не устанавливается напрямую в объекте Binding. Поэтому он наследует DataContext от вышестоящего StackPanel. Как вы могли догадаться, это укажет на свойство Description у ресурса с ключом «poseidon» и на элементе отобразиться надпись «God of the sea, earthquakes and horses».
С третьим TextBlock'ом все так же, как и со вторым. Он отобразит слово «Neptune».
Большинство использующих Data Binding программ, которые я видела, гораздо чаще используют DataContext, что гораздо сложнее, чем Source. Я рекомендую использовать DataContext только там, где вам надо связать более одного свойства от определенного источника. Когда же связывается только одно свойство, я всегда использую Source. Причина этого в том, что так проще для отладки — для того, чтобы понять, что происходит, я бы предпочла видеть всю информацию о Binding'е в одном месте, а не искать ее в ближайшем DataContext'е. В нашем маленьком примере это несложно, но в больших приложениях это сохранит вам немного времени.
Здесь вы можете найти проект для Visual Studio с кодом, который был использован в статье.