wpf - 在 WPF 样式中触发多个条件的正确方法是什么

标签 wpf xaml triggers styles multidatatrigger

我的 WPF 应用程序有一个 DataGrid控制其中。我有 DataGridRow 的默认自定义样式效果很好的类。然而,对于这一特殊的 DataGrid在这个特定的屏幕上,我需要不同的自定义样式。

每行中的项目都有一个 bool属性,设置后,我想用不同的前景色和背景色显示该行。 However, when the row is selected AND when that property is set, I want a different foreground and background color to show that it's selected AND the property is set to true.

这是我尝试过的:

<Style TargetType="DataGridRow" x:Key="CameraStyle">
    <Setter Property="Foreground" Value="{DynamicResource TextForeground}" />
    <Setter Property="Background" Value="{DynamicResource DataBackground}" />
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Property="IsSelected" Value="False" />
                <Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Foreground" Value="Red" />
            <Setter Property="Background" Value="Yellow" />
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Property="IsSelected" Value="True" />
                <Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Background"  Value="DarkOrange" />
            <Setter Property="BorderBrush" Value="{DynamicResource DataBorder}" />
            <Setter Property="Foreground"  Value="DarkRed" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

这给了我一个“绑定(bind)必须是非空”错误,我认为这是因为没有 Binding MultiDataTrigger 中第一个条件的属性。

在 XAML 中编写此代码的正确方法是什么?

编辑:

在尝试了 nemesv 和 Rachel 的答案后,代码现在可以编译并运行。但是,我为 IsSelected = true 和 IsInLiveMode = true 案例选择的颜色没有显示出来。这是我现在拥有的:
    <Style TargetType="DataGridRow" x:Key="CameraStyle">
        <Setter Property="Background" Value="{DynamicResource DataBackground}" />
        <Setter Property="Foreground" Value="{DynamicResource TextForeground}" />
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Self}}" Value="False" />
                    <Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Background" Value="Yellow" />
                <Setter Property="Foreground" Value="Red" />
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Self}}" Value="True" />
                    <Condition Binding="{Binding Path=IsInLiveMode}" Value="False" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Background"  Value="{DynamicResource DataBackgroundSelected}" />
                <Setter Property="BorderBrush" Value="{DynamicResource DataBorder}" />
                <Setter Property="Foreground"  Value="{DynamicResource DataForegroundSelected}" />
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Self}}" Value="True" />
                    <Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Background"  Value="DarkOrange" />
                <Setter Property="BorderBrush" Value="{DynamicResource DataBorder}" />
                <Setter Property="Foreground"  Value="DarkRed" />
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>

关于为什么有问题的案例不起作用的任何想法?

最佳答案

您关于缺少绑定(bind)的假设是正确的。

来自 MSDN MultiDataTrigger.Conditions :

For a MultiDataTrigger, each condition in the collection must set both the Binding and Value properties.



您可以使用 RelativeSource Self 解决此问题在绑定(bind)中引用自己:
<MultiDataTrigger.Conditions>
    <Condition Binding="{Binding RelativeSource={RelativeSource Self},
         Path=IsSelected}" Value="True" />
    <Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
</MultiDataTrigger.Conditions>

关于wpf - 在 WPF 样式中触发多个条件的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159973/

相关文章:

c# - 在 DataGrid.ItemsSource 更改后保持对一行的关注

wpf - 如何将 WPF 窗口大小设置为相对监视器屏幕的 25%

mysql - MySQL 触发器声明中缺少 'colon' 错误

wpf - 从 XAML 设置 ViewModel 属性值

c# - WPF 中的选项卡式文档界面仅使用板载方式?

wpf - 我可以在 Xaml 中指定 DataGrid 项目的类型吗?

c# - 随机分配 Button 的内容

c# - Windows 8 Live Tile - 删除文本和小图标?

mysql - 如果 BEFORE 触发器产生错误,UPDATE 是否仍会执行?

database - 在 PostgreSQL 9.1 中创建触发器时出现异常