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を依存関係プロパティにバインドしてから、マルチバインディングで要素をリストボックスのItemsSourceにバインドします。

上で述べたように、これはハックのように感じます。コンポーネントの1つとして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 に答える