Подтвердить что ты не робот

Какой правильный способ запускать несколько условий в стиле 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>

Любые идеи о том, почему данный вопрос не работает?

4b9b3361

Ответ 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" />