Re[12]: ElementName и Source, RelativeSource не эквивалентн
От: igor-booch Россия  
Дата: 30.12.15 07:53
Оценка: +1 :)
Понятно что использовать DataContext="{Binding RelativeSource={RelativeSource Self}}" нельзя только в UserControl1. В Window можно использовать.

Хорошо. Замените в предыдущем примере строки:

    <DataTemplate x:Key="dt">
      <Label Content="{Binding Data.Name1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
    </DataTemplate>


на

    <DataTemplate x:Key="dt">
      <Label Content="{Binding Data.Name1, ElementName=window}" />
    </DataTemplate>


Казалось бы они эквивалентны, но после них UserControl1 остается без текста, а Button продолжает работать нормально. Почему?

Мне ответили на msdn. https://social.msdn.microsoft.com/Forums/vstudio/en-US/ca1da6ba-80da-4947-824a-af667961cc4b/datatemplate-property-in-a-custom-usercontrol?forum=wpf

Когда внутри шаблона происходит биндинг к Data.Name1, элемент window еще не инициализирован (либо вне области видимости, неважно). В этот момент window не доступен как инициализированный элемент, но доступен по ссылке. Если вышеуказанные строки переписать так:

    <DataTemplate x:Key="dt">
      <Label Content="{Binding Data.Name1, Source={x:Reference window}}" />      
    </DataTemplate>


То заработает и кнопка и UserControl1.
Подробней об отличиях x:Reference и ElementName: http://stackoverflow.com/questions/19244111/what-is-the-difference-between-xreference-and-elementname

Хотя сначала я не понимал почему не работает UserConrol1, теперь я не понимаю почему работает Button.
http://rsdn.ru/Info/rules.xml
Отредактировано 30.12.2015 8:13 igor-booch . Предыдущая версия . Еще …
Отредактировано 30.12.2015 8:02 igor-booch . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.