问:如何从子控件的样式 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 来更改展开切换按钮的图像——有什么想法吗?
非常感谢您的帮助!