2013-01-15 54 views
6

我正在WPF中進行自定義控件。我仍然在學習TemplateBinding的用處(在自定義控件中使用了很多)。使用TemplateBindings進行多重綁定

有人認爲我注意到,我似乎無法在MulitBinding中使用TemplateBinding。

當我試試這個:

<ComboBox.ItemsSource> 
    <MultiBinding Converter="{StaticResource MyMultiConverter}"> 
     <Binding ElementName="PART_AComboBox" Path="SelectedItem"/> 
     <TemplateBinding Property="MyListOne"/> 
     <TemplateBinding Property="MyListTwo"/> 
    </MultiBinding> 
</ComboBox.ItemsSource> 

我得到這個錯誤:

The value "System.Windows.TemplateBindingExpression" is not of type "System.Windows.Data.BindingBase" and cannot be used in this generic collection.
Parameter name: value

我缺少的東西?有沒有辦法做到這一點?

這是我要去的解決方法,但它是一種黑客攻擊的:

<ListBox x:Name="ListOne" 
     ItemsSource="{TemplateBinding MyListOne}" 
     Visibility="Collapsed" /> 
<ListBox x:Name="ListTwo" 
     ItemsSource="{TemplateBinding MyListTwo}" 
     Visibility="Collapsed" /> 

<ComboBox.ItemsSource> 
    <MultiBinding Converter="{StaticResource DictionaryFilteredToKeysConverter}"> 
     <Binding ElementName="PART_TextTemplateAreasHost" Path="SelectedItem"/> 
     <Binding ElementName="ListOne" Path="ItemsSource"/> 
     <Binding ElementName="ListTwo" Path="ItemsSource"/> 
    </MultiBinding> 
</ComboBox.ItemsSource> 

我的列表框綁定到依賴屬性,然後在我的mulitbinding我做的一個元素結合的的ItemsSource列表框。

正如我上面所說,這感覺就像一個黑客和我想知道是否有一個正確的方法來做一個TemplateBinding作爲其中一個組件的MultiBinding。

回答

16

你可以使用:

<Binding Path="MyListOne" RelativeSource="{RelativeSource TemplatedParent}"/> 

TemplateBinding真的是上述的只是一個短手,優化版本。它在何處以及如何使用方面非常嚴格(直接在模板內部沒有分層路徑等等)。

XAML編譯器在提供有關這些類型問題的體面反饋方面仍然相當垃圾(至少在4.0中,未針對此特性進行測試4.5)。剛纔我這個XAML:

<ControlTemplate TargetType="..."> 
    <Path ...> 
     <Path.RenderTransform> 
      <RotateTransform Angle="{TemplateBinding Tag}"/> 
     </Path.RenderTransform> 
    </Path> 
</ControlTemplate> 

它編譯和執行罰款,但不具約束力的Tag旋轉角度值。我窺探了一下,發現財產被綁定了,但是零。直覺上(經過多年處理這個煩惱)我改變它:

<ControlTemplate TargetType="..."> 
    <Path ...> 
     <Path.RenderTransform> 
      <RotateTransform Angle="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}"/> 
     </Path.RenderTransform> 
    </Path> 
</ControlTemplate> 

它工作得很好。

+0

完美!謝謝你的偉大答案! – Vaccano