我正在创建一个自定义控件,我在将DataTemplate中的UI元素绑定到自定义控件的依赖项属性时遇到了问题。
我的控件中有一个内容控件,应该根据某个属性更改其内容和内容模板,所以我这样绑定 -
<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绑定到他们的itemssource,因为这个错误例如 -
“无法在ContentPresenter类型上找到TreeSourceProperty”
我一直在寻找答案,我发现这个简单的答案说这是不可能的。
How to use template binding inside data template in custom control (Silverlight)
所以,如果这真的不可能,我怎样才能将模板中的元素绑定到CustomControl的DependencyProperties?
谢谢!
答案 0 :(得分:5)
在WPF中,您可以使用针对“模板化”控件的RelativeSource
绑定。
e.g。
{Binding TreeSource,
RelativeSource={RelativeSource AncestorType=MyCustomControl}}
编辑:如果您在树中休息,您可以通过传递该控件来解决这个问题,例如
<ControlThatOwnsPopup
Tag="{Binding RelativeSource={RelativeSource AncestorType=MyCustomControl}}">
<Popup>...
<TreeView ItemsSource="{Binding PlacementTarget.Tag.TreeSource,
RelativeSource={RelativeSource AncestorType=Popup}}"/>