如果datacontext是Type T的对象,如何将样式应用于treeviewitem

时间:2013-11-20 23:44:51

标签: c# wpf triggers

有没有办法做到这一点,或者我是否必须在ViewModel上创建一个IsSelectedProperty并将其绑定到那个?

我希望能够做类似Source = {Binding RelativeAncestor ListViewItem}

的事情

但是只有这个属性sourcename,如果我用x命名它们,我可以用来根据datatemplate中的项设置触发器:Name

                <HierarchicalDataTemplate.Triggers>
                  <Trigger SourceName="" Property="IsSelected" Value="True">
                    <Setter TargetName="bdr" Property="Foreground" Value="White"/>
                    <Setter TargetName="bdr" Property="Foreground" Value="Red"/>
                  </Trigger>
                </HierarchicalDataTemplate.Triggers>

回想起来,我意识到昨天我做了一个非常令人困惑的帖子。另外,考虑到我甚至可以解释人们对我的问题的评论,我应该提供更多详细信息。

我知道在wpf中你可以通过设置目标控件类型的样式来设置基于控件的触发器。

此外,您还拥有可触发datacontext属性的数据触发器。我希望有一种方法可以在datacontext是特定类型的对象时使用触发器或数据触发器来设置属性。

这可能吗?如果没有,我将在我的情况下接受所提供的答案,但由于这将要求我向我的viewmodel添加一个属性,检查是否有办法只检查项目类型而不是必须检查实际的财产。

1 个答案:

答案 0 :(得分:1)

我建议您在视图模型中绑定IsSelected属性,但这只是我。

我不确定你的HierarchicalDataTemplate是多么复杂,或者某些项目是否需要更改前景,而有些则不需要;但我假设你想要更新整个TreeView中选择的项目(如果这是为了这个)。

如果是这种情况,只需将DataTrigger添加到TreeViewItem的样式:

<Style TargetType="TreeViewItem">
    <Setter Property="IsSelected"
            Value="{Binding IsSelected, Mode=TwoWay}" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsSelected}" Value="True">
            <Setter Property="Foreground"
                    Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding IsSelected}"
                     Value="False">
            <Setter Property="Foreground"
                    Value="Black" />
        </DataTrigger>
    </Style.Triggers>
</Style>

请注意,如果您不想,则不需要绑定IsSelected参数,因为它位于我的代码中。