Какой правильный способ запускать несколько условий в стиле WPF
В моем приложении WPF есть DataGrid
управления DataGrid
. У меня есть стандартный стиль по умолчанию для класса DataGridRow
который работает хорошо. Однако для этого одного DataGrid
на этом конкретном экране мне нужен другой пользовательский стиль.
Элементы в каждой строке имеют свойство bool
которое, когда установлено, я хочу отобразить эту строку с другим цветом переднего плана и фона. Однако, когда строка выбрана AND, когда это свойство установлено, я хочу, чтобы другой цвет переднего и заднего фона показывал, что он выбран И для свойства установлено значение 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>
Это дает мне ошибку "Binding должно быть не null", которая, как я думаю, происходит, потому что в первом условии MultiDataTrigger нет свойства Binding
.
Каков правильный способ написать это в 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>
Любые идеи о том, почему данный вопрос не работает?
Ответы
Ответ 1
Ваше предположение верно относительно отсутствия привязки.
Из 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>
Ответ 2
Вы используете MultiDataTrigger
, который по-прежнему является DataTrigger
и ожидает привязки
Property="IsSelected"
Switch Property="IsSelected"
в вашем Condition
для
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}"
Value="True" />