私の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>
問題のケースが機能しない理由について何かアイデアはありますか?
バインディングの欠落に関して、あなたの仮定は正しいです。
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>
MultiDataTrigger
を使用していますが、これはまだDataTrigger
であり、バインディングが必要です。
スイッチProperty="IsSelected"
あなたのCondition
から
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}"
Value="True" />