问:如何从子控件的样式DataTrigger
绑定到模板父的自定义属性我已经在这个问题上摸不着头几天了。
我有一个数据绑定TreeView,它使用一个带有模板的Style。 TreeView绑定到ObservableCollection,HierarchicalDataTemplate + DataTemplate绑定到集合项中的属性。
FontGroup - >字体(S)
<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是否为真来更改展开切换按钮的图像 - 任何想法?
非常感谢您的帮助!
答案 0 :(得分:5)
视图模型很可能是DataContext
,因此绑定应该是RelativeSource
绑定,其中相应的路径需要明确定位DataContext
,因为新的源是RelativeSource
:
{Binding DataContext.IsItemSelected,
RelativeSource={RelativeSource AncestorType=TreeViewItem}}
正如我在评论中所指出的那样,从ControlTemplate中提取这个逻辑可能是明智的,因为这会留下它的界限。一种方法是对ToggleButton
进行子类化并为图像公开公共属性,然后可以通过Style
进行更改。