Ton*_*ile 13 wpf xaml triggers styles multidatatrigger
我的WPF应用程序中有一个DataGrid
控件.我有一个适合DataGridRow
该类的默认自定义样式.但是,对于这个DataGrid
特定屏幕上的这个特定,我需要一个不同的自定义样式.
每行中的Items都有一个bool
属性,设置后,我想显示具有不同前景色和背景色的行.但是,当选择行并且设置了该属性时,我想要一个不同的前景色和背景色来显示它已被选中并且该属性设置为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>
Run Code Online (Sandbox Code Playgroud)
这给了我一个"绑定必须是非null"错误,我认为这是因为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>
Run Code Online (Sandbox Code Playgroud)
关于为什么案件不起作用的任何想法?
nem*_*esv 18
关于缺失的绑定,您的假设是正确的.
来自MSDN MultiDataTrigger.Conditions:
对于MultiDataTrigger,集合中的每个条件都必须同时设置Binding和Value属性.
您可以使用RelativeSource Self来解决这个问题,以便在绑定中引用自己:
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self},
Path=IsSelected}" Value="True" />
<Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
</MultiDataTrigger.Conditions>
Run Code Online (Sandbox Code Playgroud)
你正在使用a MultiDataTrigger
,它仍然是一个DataTrigger
并期望绑定
切换Property="IsSelected"
到你Condition
的
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}"
Value="True" />
Run Code Online (Sandbox Code Playgroud)