WPF Datagrid行前景色多重触发器

时间:2016-05-29 19:21:56

标签: wpf xaml datagrid wpf-style

我希望在鼠标结束并同时选择行时更改数据网格的前景色。

我的代码如下:

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="Padding" Value="4,0,0,0"/>
    <Setter Property="BorderBrush" Value="#d2c09e"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" TextElement.Foreground="{TemplateBinding Foreground}" SnapsToDevicePixels="True">
                    <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="True"/>
                <Condition Property="IsMouseOver" Value="True"/>
            </MultiTrigger.Conditions>
            <MultiTrigger.Setters>
                <Setter Property="Foreground" Value="Green"/>
            </MultiTrigger.Setters>
        </MultiTrigger>
    </Style.Triggers>
</Style>

它仅改变一个细胞的颜色。

但这有效:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsSelected" Value="True"/>
    </MultiTrigger.Conditions>
    <MultiTrigger.Setters>
        <Setter Property="Foreground" Value="Green"/>
    </MultiTrigger.Setters>
</MultiTrigger>

当我想在鼠标结束时改变颜色时,它不起作用。

那我怎么能这样做?

提前致谢。 : - )

1 个答案:

答案 0 :(得分:0)

当所有条件为真(二元和操作)时, MultiTrigger 会应用关联的setter或操作。因此,在您的情况下,仅当满足IsSelected和IsMouseOver时,前景才会更改。

如上所述,触发器将触发所有条件为AND'd,这就是为什么当你将所有条件放在一起时它不起作用的原因。生成OR(不实现IMultiValueConverter)的最简单方法是使用多个数据触发器(这意味着二进制OR操作)或单独触发。

DataGridCell 可以单独使用触发器而不是 MultiTrigger

检查以下代码。我测试了它,它在我身边完美运行。如果有任何问题,请尝试还原。

    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="Green"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Green"/>
        </Trigger>
    </Style.Triggers>