Информация об изменениях

Сообщение Re[12]: ElementName и Source, RelativeSource не эквивалентн от 30.12.2015 7:53

Изменено 30.12.2015 8:13 igor-booch

Понятно что использовать 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

Хотя я теперь я не понимаю почему работает Button?
Re[12]: ElementName и Source, RelativeSource не эквивалентн
Понятно что использовать 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.