在DataTemplates中使用TemplateBinding

时间:2012-02-23 07:53:34

标签: wpf binding datatemplate

我正在创建一个自定义控件,我在将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?

谢谢!

1 个答案:

答案 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}}"/>