绑定到模板父级的cutom属性

Dom*_*nic 1 wpf binding templates parent findancestor

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

我已经在这个问题上摸不着头几天了.

我有一个数据绑定TreeView,它使用一个具有模板的Style.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>
Run Code Online (Sandbox Code Playgroud)

首先我尝试绑定:

Binding Path=IsItemSelected, RelativeSource={RelativeSource TemplatedParent}
Run Code Online (Sandbox Code Playgroud)

然后我读到这可能不起作用所以我尝试了(包括AncestorLevel 1 + 3):

Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2
Run Code Online (Sandbox Code Playgroud)

还尝试过使用UpdateSourceTrigger = PropertyChanged和Mode = TwoWay的组合

如果这是一个有缺陷的设计,请建议一种方法:我基本上想要根据TreeViewItem上的属性IsItemSelected是否为true来更改展开切换按钮的图像 - 任何想法?

非常感谢您的帮助!

H.B*_*.B. 5

视图模型很可能是DataContext,所以绑定应该是一个RelativeSource绑定到相应的路径,需要明确目标,DataContext因为新的源是RelativeSource:

 {Binding DataContext.IsItemSelected,
          RelativeSource={RelativeSource AncestorType=TreeViewItem}}
Run Code Online (Sandbox Code Playgroud)

正如我在评论中所指出的那样,从ControlTemplate中提取这个逻辑可能是明智的,因为这会留下它的界限.一种方法是子类化ToggleButton和公开图像的公共属性,然后可以通过a更改Style.