WPF自定义控件 - 将模板项绑定到路径

时间:2011-02-24 05:01:09

标签: wpf binding

在WPF自定义控件模板中,有什么方法可以在XAML中执行以下操作?:

var selItemText = this.GetTemplateChild("PART_SelectedItemText") as TextBlock;
var binding = new Binding("SelectedItem." + DisplayMemberPath);
binding.RelativeSource = new RelativeSource(RelativeSourceMode.TemplatedParent);
selItemText .SetBinding(TextBlock.TextProperty, binding);

请注意,此语句的有趣部分是绑定构造函数 - 我正在根据我指定的某些文本(“SelectedItem。”)和用户提供的路径构建路径。

消费者将使用类似于以下的控件:

<c:MyControl DisplayMemberPath="Description" />

2 个答案:

答案 0 :(得分:1)

您可以将其拆分为两个不同的绑定。将SelectedItem绑定到TextBlock和TextBox.Text的顶层控件绑定到DisplayMemberPath作为TemplateBinding。

答案 1 :(得分:1)

简短回答:不,不可能在控件模板中完全使用xaml

你的可能性是:

  • 使用你拥有的东西(可能使用附加属性/行为使其更像MVVM)
  • 使用MultiBinding一个绑定到“SelectedItem”另一个绑定到“DisplayMemberPath”和你的MultiValueConverter使用Reflection来反映DisplayMemberPath(可能有点难看)
  • 创建一个继承自Binding的类,并公开可以将DisplayMemberPath绑定到的属性,并更改底层绑定(read here以了解如何执行此操作)(复杂)
  • 使用Reflection实例化MS.Internal.Data.DisplayMemberTemplateSelector /构建类似的东西
  • 想想你的设计是否正确。除了你的Control是某种ItemsControl(如果是这种情况你应该从ItemsControl继承并使用你到达的DisplayMemberPath),我不明白为什么你不应该在外部使用绑定,如{{1}在ControlTemplate中使用TemplateBinding绑定到“DisplayMember”