複数のビューモデルの条件に基づいてスタイルを適用する方法はありますか。2つのビューモデルに基づく条件付き書式設定
例えば、私は条件付きでアイテムレベルでフォーマットすることができる項目のリストを持っているが、私はまた、リスト全体レベルでオンまたはオフに書式設定を有効にすることができるようにしたい:
メインビューモデル
class ParentViewModel : ViewModelBase
{
public ParentViewModel()
{
Items = new ObservableCollection<ChildViewModel> {
new ChildViewModel{ Display = "I am red", Format=1 },
new ChildViewModel{ Display = "I am red", Format=1 },
new ChildViewModel{ Display = "I am blue", Format=2 },
new ChildViewModel{ Display = "I am blue", Format=2 },
};
ShowFormatting = false;
}
public ObservableCollection<ChildViewModel> Items { get ... }
// I would like to use this property to turn formatting off for the whole list
public bool ShowFormatting { get ... }
}
がウィンドウに表示される多くのサブビューモデル
class ChildViewModel: ViewModelBase
{
public string Display { get ... }
public int Format { get ... }
}
が含まれています
<Window ...>
<Grid>
<Grid.Resources>
<Style x:Key="MyStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<!-- How can I access ShowFormatting from the main view model here? -->
<DataTrigger Binding="{Binding Format}" Value="1">
<Setter Property="Foreground" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Format}" Value="2">
<Setter Property="Foreground" Value="Blue"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<ListView ItemsSource="{Binding Items}">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<!-- Or can I apply the conditional formatting here? -->
<DataTemplate DataType="{x:Type local:ChildViewModel}">
<TextBlock Text="{Binding Display}" Style="{StaticResource MyStyle}"></TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
私が見ている問題は、スタイルがChildViewModel
をターゲットにしており、ShowFormatting
プロパティにアクセスできないということです。私が思いつくことができる最善の解決策は、ChildViewModel
からParentViewModel
へのバックリンクを持つことですが、バックリンクを持つことは一般に私にとっては悪いようです。これを行うより良い方法はありますか?
私はあなたが '... {RelativeSource AncestorType = {x:Type Window}}}}'と思っています。私のデータコンテキストは、ウィンドウより少し上に設定されていましたが、これは機能します。ありがとう。 – Jonny