Как правильно запускать несколько условий в стиле WPF
мое приложение WPF имеет DataGrid
управление в нем. У меня есть пользовательский стиль по умолчанию для DataGridRow
класс, который работает хорошо. Однако для этого одного конкретного DataGrid
на этом конкретном экране мне нужен другой пользовательский стиль.
элементы в каждой строке есть 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>
это дает мне ошибку" привязка должна быть ненулевой", которая, я думаю, происходит, потому что нет Binding
свойство при первом условии в MultiDataTrigger.
как правильно написать это в XAML?
EDIT:
после попытки ответа 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>
есть идеи о том, почему рассматриваемый случай не работает?
2 ответов
ваш assumptution правильно относительно отсутствия привязки.
из MSDN MultiDataTrigger.Условия:
для MultiDataTrigger, каждое условие в коллекции обязательно установить обе привязка и значение свойства.
вы можете решить эту проблему с помощью RelativeSource Self чтобы сослаться на себя в привязке:
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self},
Path=IsSelected}" Value="True" />
<Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
</MultiDataTrigger.Conditions>
вы используете MultiDataTrigger
, которая DataTrigger
и ожидает привязки
переключатель Property="IsSelected"
в своем Condition
до
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}"
Value="True" />