2011-02-24 88 views
1

在WPF自定義控件模板,有沒有什麼辦法,我可以做的XAML以下?:WPF自定義控件 - 綁定模板項目的路徑

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" /> 

回答

1

簡短的回答:不,這不可能在XAML中的ControlTemplate內完全得到這個

您的可能性是:

  • 使用你所擁有的(可能使用附加屬性/行爲,使其更多MVVM-like)
  • 使用MultiBinding一個綁定到「SelectedItem」另一個綁定到「DisplayMemberPath」並使用Reflection的MultiValueConverter反射DisplayMemberPath(可能有點難看)
  • create ac lass從Binding繼承並暴露屬性,您可以將DisplayMemberPath綁定到並更改底層綁定(read here)(複雜)
  • 使用反射來實例化MS.Internal.Data.DisplayMemberTemplateSelector /構建一些東西類似
  • 想想你的設計是否正確。除了你的控件是某種ItemsControl(如果是這種情況,你應該繼承ItemsControl並使用DisplayMemberPath),我不明白爲什麼你不應該在外部使用綁定,比如<c:MyControl DisplayMember="{Binding SelectedItem.Description}" />以及你的ControlTemplate使用TemplateBinding綁定到「DisplayMember」
1

你可以把它拆分到兩個不同的綁定。將SelectedItem綁定到TextBlock的頂級控件,然後將TextBox.Text作爲TemplateBinding綁定到DisplayMemberPath。

+0

嗨Jobi,感謝您的回答,但我仍然不完全理解我需要做什麼。有沒有可能提供一些樣品XAML? – 2011-02-24 19:08:24

+0

可以請您發佈您在XAML方面嘗試的代碼,然後我們可以看看。 – 2011-02-24 21:05:07