如何使用Relative Source绑定来获取Parent类?

时间:2018-04-16 23:10:14

标签: c# wpf xaml data-binding

我有一个带有HierarchicalDataTemplate的TreeView,如下所示:

<TreeView ItemsSource="{Binding Situation.TopLevelSituationList}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:GroupSubGroup}" ItemsSource="{Binding SubGroups}"/>
        <HierarchicalDataTemplate DataType="{x:Type local:GroupDecision}" ItemsSource="{Binding Decisions}">
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Style="{StaticResource TextBlockBaseStyling}" Text="{Binding}"/>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.Resources>

在我的基础,抽象类中,它设置如下:

public abstract class Group
{
    private bool isSelected;
    public bool IsSelected
    {
        get
        {
            return this.isSelected;
        }
        set
        {
            this.isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }

从这个类派生的两个类是我的TreeView中的引用,每个类都有自己的HierarchicalDataTemplate(GroupSubGroup,GroupDecision)。

这是我的问题:

<HierarchicalDataTemplate DataType="{x:Type local:GroupDecision}" ItemsSource="{Binding Decisions}">

此ItemsSource是字符串的集合。我知道我需要使用RelativeBinding来引用GroupDecision类中的其他属性。

我的TreeView是这样的:    GroupSubGroups&#39; ItemsSource是Group类型的集合,因此我将始终直接引用IsSelected属性。

对于视觉辅助,这就是我的TreeView和TreeView项目的样子:

 ------------------------------------
| This row is a GroupDecision       |
| --------------------------------  |
| This row is a Decision (str)      |
| This row is also a Decision (str) |
|                                   |
-------------------------------------

当我选择顶行,GroupDecision行时,我能够在IsSelected属性上触发PropertyChange。但是,如果我要选择一个Decision行,我不会得到相同的触发因为它实际上是一个String。

这样做的目的是让TreeViewItem的边框在选中时变粗,但是如果我选择顶行但我想要选择一个决策字符串我想要具有相同的功能,因为它是包含在内......

我希望这很清楚。如果我能进一步解释,请告诉我。

编辑:我将一个样式应用于边框,但单击字符串行时它不会增加边框粗细的大小:

<Border.Style>
    <Style TargetType="Border">
        <Setter Property="BorderBrush" Value="{Binding GroupColor}"/>
        <Setter Property="Grid.Column" Value="1"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" Value="True">
                <Setter Property="BorderThickness" Value="3"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Border.Style>

1 个答案:

答案 0 :(得分:0)

由于您无论如何都需要在每个模板中定义边框,因此明确地为其定义一个您定义为资源的样式非常简单。

在TreeView.Resources中定义样式:

   <TreeView.Resources>
        <Style TargetType="Border" x:Key="ExpandingBorder">
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected
, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" 
  Value="True">
                    <Setter Property="BorderThickness" Value="3"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

然后,您可以在模板的任何边框上使用它。例如:

<HierarchicalDataTemplate DataType="{x:Type local:Family}" ItemsSource="{Binding Members}">
    <Border Style="{StaticResource ExpandingBorder}">
        <StackPanel Orientation="Horizontal"
                    Height="32"
                    >
            <Label VerticalAlignment="Center" FontFamily="WingDings" Content="1"/>
            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </Border>
</HierarchicalDataTemplate>