2012-02-23 69 views
2

我正在創建一個自定義控件,並且在將DataTemplate中的UI元素綁定到自定義控件的依賴項屬性時遇到了問題。在DataTemplates中使用TemplateBinding

有一個在我的控制內容的控制應該按照一定的屬性更改其內容和內容的模板,所以我必然是這樣 -

<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?

謝謝!

回答

5

在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}}"/> 
+0

是的,這將在常​​規狀態下工作,但我忘了提,我CustomControl打開一個彈出(實際上更多的窗口彈出的),而這個ContentControl中實際居住在彈出窗口中,因此在其祖先中找到CustomControl將不起作用,因爲它不在同一個邏輯樹上。 – Dror 2012-02-24 07:53:56

+0

@Orchestrator:這是有問題的。看我的編輯... – 2012-02-24 11:12:22