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