1

问:如何从子控件的样式 DataTrigger 绑定到模板父级的自定义属性

几天来,我一直在为这个问题挠头。

我有一个数据绑定 TreeView,它使用具有模板的样式。TreeView 绑定到 ObservableCollection 和 HierarchicalDataTemplate + DataTemplate 绑定到集合项内的属性。

字体组 -> 字体

<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具有相应路径的绑定,该路径需要明确定位 ,DataContext因为新源是RelativeSource

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

正如我在评论中所指出的,最好从 ControlTemplate 中提取此逻辑,因为这会超出其界限。一种方法是子类化ToggleButton并公开图像的公共属性,然后可以通过Style.

于 2011-08-02T01:23:53.707 回答