web-dev-qa-db-ja.com

WPFスタイルで複数の条件でトリガーする正しい方法は何ですか

私のWPFアプリケーションにはDataGridコントロールがあります。 DataGridRowクラスのデフォルトのカスタムスタイルがあります。これはうまく機能します。ただし、この1つの特定の画面のこの1つの特定の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 must be non-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>

問題のケースが機能しない理由について何かアイデアはありますか?

13
Tony Vitabile

バインディングの欠落に関して、あなたの仮定は正しいです。

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>
18
nemesv

MultiDataTriggerを使用していますが、これはまだDataTriggerであり、バインディングが必要です。

スイッチProperty="IsSelected"あなたのConditionから

<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" 
           Value="True" />
8
Rachel