10

我正在 WPF 中制作自定义控件。我仍在学习 TemplateBinding 的来龙去脉(在自定义控件中经常使用)。

有人认为我注意到的是,我似乎无法在 MulitBinding 中使用 TemplateBinding。

当我尝试这个时:

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

我收到此错误:

值“System.Windows.TemplateBindingExpression”不是“System.Windows.Data.BindingBase”类型,不能在此通用集合中使用。
参数名称:值

我错过了什么吗?有没有办法使这项工作?

这是我要解决的方法,但它有点像黑客:

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

我将 ListBoxes 绑定到依赖属性,然后在我的 mulitbinding 中将元素绑定到列表框的 ItemsSource。

正如我上面所说,这感觉像是一种 hack,我想知道是否有正确的方法来使用 TemplateBinding 作为组件之一进行 MultiBinding。

4

1 回答 1

27

你可以使用:

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

它工作得很好。

于 2013-01-15T17:08:52.833 回答