1

Q: 子コントロールのスタイル DataTrigger からテンプレートの親のカスタム プロパティにバインドするにはどうすればよいですか?

私はこれについて数日間頭を悩ませてきました。

テンプレートを持つスタイルを使用するデータバインドされた TreeView があります。TreeView は ObservableCollection にバインドされ、HierarchicalDataTemplate + DataTemplate はコレクション アイテム内のプロパティにバインドされます。

FontGroup -> フォント

<Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}">
...
<Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Image x:Name="ExpanderImage" Source="/Typesee;component/Resources/tree_expand.png" RenderOptions.BitmapScalingMode="NearestNeighbor" />
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="??? IsItemSelected ???" Value="True">
                            <Setter TargetName="ExpanderImage" Property="Source" Value="/Typesee;component/Resources/tree_collapse_selected.png" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<ControlTemplate x:Key="FontTreeViewTemplate" TargetType="{x:Type TreeViewItem}">
...
    <ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}" ... />
...
    <ControlTemplate.Triggers>
            <DataTrigger Binding="{Binding IsItemSelected}" Value="True">
            <!-- WORKS FINE HERE -->
            </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

最初に次のようにバインドしようとしました:

Binding Path=IsItemSelected, RelativeSource={RelativeSource TemplatedParent}

次に、それが機能しない可能性があることを読んだので、試しました(AncestorLevel 1 + 3を含む):

Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2

UpdateSourceTrigger=PropertyChanged と Mode=TwoWay の組み合わせも試しました

これが欠陥のある設計である場合は、これを行う方法を提案してください: 基本的に、TreeViewItem でプロパティ IsItemSelected が true であるかどうかに基づいて、展開トグル ボタンの画像を変更したいと考えています。

助けてくれてありがとう!

4

1 に答える 1

6

ほとんどの場合、ビューモデルは になるDataContextため、バインディングは、新しいソースが であるため、RelativeSourceを明示的にターゲットにする必要があるそれぞれのパスを持つバインディングである必要があります。DataContextRelativeSource

 {Binding DataContext.IsItemSelected,
          RelativeSource={RelativeSource AncestorType=TreeViewItem}}

私のコメントで述べたように、このロジックは ControlTemplate から抽出することをお勧めします。1 つの方法は、 をサブクラス化ToggleButtonし、イメージのパブリック プロパティを公開することです。このパブリック プロパティは、Style.

于 2011-08-02T01:23:53.707 に答える