Использование TemplateBinding внутри DataTemplates
Я создаю пользовательский элемент управления, и у меня возникают проблемы с привязкой элементов пользовательского интерфейса внутри DataTemplate к свойствам зависимостей пользовательского элемента управления.
В моем контроле есть элемент управления содержимым, который должен изменять его содержимое и шаблон содержимого в соответствии с определенным свойством, поэтому я связал его следующим образом:
<ContentControl Content="{TemplateBinding ControlMode}" ContentTemplateSelector="{StaticResource TemplateSelector}"/>
Селектор шаблона содержимого определяется следующим образом:
<ns:TemplateSelector x:Key="TemplateSelector">
<ns:TemplateSelector.Template1>
<DataTemplate>
<TreeView ItemsSource="{TemplateBinding TreeSource}"/>
</DataTemplate>
</ns:TemplateSelector.Template1>
<ns:TemplateSelector.Template2>
<DataTemplate>
<ListView ItemsSource="{TemplateBinding ListSource}"/>
</DataTemplate>
</ns:TemplateSelector.Template2>
</ns:TemplateSelector>
Проблема в том, что TreeView и ListView не могут быть связаны с их источником элементов с TemplateBinding из-за этой ошибки, например:
"Не удается найти TreeSourceProperty для типа ContentPresenter"
Я искал ответ, и нашел этот ответ, который просто заявляет, что это невозможно.
Так что, если это действительно невозможно, как еще можно связать элементы внутри моего шаблона с DependencyProperties пользовательского элемента управления?
Спасибо!
1 ответ
В WPF вы можете использовать привязку с RelativeSource
нацеливание на "шаблонный" элемент управления.
например
{Binding TreeSource,
RelativeSource={RelativeSource AncestorType=MyCustomControl}}
Изменить: Если у вас есть разрыв в дереве, вы можете обойти это, передавая этот контроль, например,
<ControlThatOwnsPopup
Tag="{Binding RelativeSource={RelativeSource AncestorType=MyCustomControl}}">
<Popup>...
<TreeView ItemsSource="{Binding PlacementTarget.Tag.TreeSource,
RelativeSource={RelativeSource AncestorType=Popup}}"/>