C# 基于两种视图模型的条件格式

C# 基于两种视图模型的条件格式,c#,wpf,xaml,C#,Wpf,Xaml,是否有方法基于多视图模型中的条件应用样式 例如,我有一个可以在项目级别有条件格式化的项目列表,但我还希望能够在整个列表级别打开或关闭格式化: 主视图模型 class ParentViewModel : ViewModelBase { public ParentViewModel () { Items = new ObservableCollection<ChildViewModel> { new ChildViewModel{

是否有方法基于多视图模型中的条件应用样式

例如,我有一个可以在项目级别有条件格式化的项目列表,但我还希望能够在整个列表级别打开或关闭格式化:

主视图模型

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 ... } 
}
在窗口中显示

<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
建立反向链接,但是反向链接对我来说通常是不好的。有更好的方法吗?

使用
相对资源进行绑定怎么样?(这里我假设窗口的DataContext类型为
ParentViewModel



一种方法是使用两种不同的子视图模型,
ChildViewModel1
ChildViewModel2
ParentViewModel
将使用以下一种或两种类型填充
:如果愿意,您可以使用
可观察集合
。当您为
ChildViewModel1
定义一个数据模板,为
ChildViewModel2
定义另一个数据模板时,根据
observateCollection
中驻留的子视图模型,您将得到相应的呈现。

有趣的想法,但我特意简化了上面的示例(我总是发现很难在足够简化以使其易懂但又不遗漏太多内容之间取得平衡)。在我的真实示例中,我有一个左列表和右列表-左列表项不应格式化,并且可以在列表之间移动。我想您需要
。{RelativeSource AncestorType={x:Type Window}}…
。我的数据上下文在中设置得比窗口稍微远一点,但这是可行的。谢谢。
<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>
<Grid.Resources>
  <Style x:Key="MyStyle" TargetType="{x:Type TextBlock}">
    <Style.Triggers>
      <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>
      <DataTrigger Binding="{Binding Path=DataContext.ShowFormatting, RelativeSource={RelativeSource AncestorType=Window}}" Value="SomeValue">
        <Setter Property="SomeProperty" Value="SetToThisValue"></Setter>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</Grid.Resources>