WPF-DataTriggerとトリガーを組み合わせる方法
-
03-07-2019 - |
質問
注関連する質問: DataTriggerとEventTriggerを組み合わせる方法
複数のアイテムを含むリストボックスがあります。アイテムのクラスは INotifyPropertyChanged
を実装し、プロパティ IsAvailable
を持っています。このプロパティを使用して、リストで使用できないオプションを別の色で示します。
ただし、選択したアイテムが利用できない場合、前景色は赤になります。
<ListBox>
<ListBox.Resources>
<DataTemplate DataType="{x:Type local:InstitutionViewModel}">
<TextBlock Name="Name" Text="{Binding Name}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsAvailable}" Value="False">
<Setter TargetName="Name" Property="Foreground" Value="#888"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.Resources>
</ListBox>
上記のデータトリガーを使用して、使用できないアイテムをグレー表示します。
私が直面している問題は、アイテムが選択されているという事実は、テンプレートがバインドされている基になるデータとは何の関係もないということです。私が本当に欲しいのは、依存関係プロパティの通常の Trigger
( ListBoxItem.IsSelected
)と DataTrigger
バインドされたデータ項目。
選択の概念をビューモデルに導入せずにこれを実行できますか?
利用できないアイテムを無効にしない理由がわからない場合は、利用できないオプションを選択できることがアプリケーションの要件であることを理解してください。実際にはいくつかのリストボックスがあり、1つの選択ボックスは他のボックスで使用可能なものに影響します。以前の選択に基づいてアイテムが無効にされた場合、ユーザーは気が変わったり、さまざまな組み合わせを調べたりできないため、アイテムを無効にすることはできません。
解決
この問題に直面している他の人のために、私に役立つ解決策を見つけました。もちろん、私はまだ他の興味深い答えを見ることに興味があります。
これが私がしたことです:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding
RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
Path=IsSelected}" Value="True"/>
<Condition Binding="{Binding IsAvailable}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter TargetName="Name" Property="Foreground" Value="#F00"/>
</MultiDataTrigger>
しかし、これがマルチトリガーであることについて特別なことはありません。データテンプレートで選択したアイテムのスタイルを変更したい場合は、次を使用できます。
<DataTrigger Binding="{Binding
RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
Path=IsSelected}" Value="True">
<Setter TargetName="Name" Property="Foreground" Value="#888"/>
</DataTrigger>
他のヒント
DataGridRow
で使用するには、バインディングモードを Self
に変更します:
Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=...