如何基于 DataTrigger 为 DataGrid 中的 Expander 着色?

How to color Expander in a DataGrid based on a DataTrigger?

我在根据 DataTriggerDataGrid 中的 Expander 上色时遇到问题。我试了很多东西,也刷了很多线程,但是运气不好。

我希望根据 ItemsSource.

中的布尔值更改颜色

下面是设置 ItemsSource:

的代码
private void SetDataGrid(ObservableCollection<SourceInfo> myinfoList)
{
   var ColectList = new ListCollectionView(myinfoList);
   ColectList.GroupDescriptions.Add(new PropertyGroupDescription("DrawNr"));

   MyDataGrid.ItemsSource = ColectList;
}

下面是我的XAML(check是我在class中的参数,也就是itemsource):

<DataGrid ItemsSource="{Binding}"
          Name="MyDataGrid"
          Margin="244,10,20,7"
          AutoGenerateColumns="True"
          CanUserAddRows="False"
          RowEditEnding="MyDataGrid_RowEditEnding"
          Loaded="MyDataGrid_Loaded"
          BorderBrush="{x:Null}"
          Background="{x:Null}"
          HorizontalGridLinesBrush="#FF646464"
          VerticalGridLinesBrush="#FF646464"
          FontFamily="Open Sans">
   <DataGrid.GroupStyle>
      <GroupStyle>
         <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
               <Setter Property="Margin"
                       Value="0,0,0,5" />
               <Setter Property="Template">
                  <Setter.Value>
                     <ControlTemplate TargetType="{x:Type GroupItem}">
                        <Expander IsExpanded="False"
                                  BorderBrush="#FF002255"
                                  Foreground="Black"
                                  BorderThickness="1,1,1,5">
                           <Expander.Style>
                              <Style TargetType="{x:Type Expander}">
                                 <Setter Property="Background"
                                         Value="Red" />
                                 <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=check, RelativeSource={RelativeSource self}}"
                                                 Value="True">
                                       <Setter Property="Background"
                                               Value="Green" />
                                    </DataTrigger>
                                 </Style.Triggers>
                              </Style>
                           </Expander.Style>
                           <Expander.Header>
                              <StackPanel>
                                 <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding DrawNr}" />
                                    <TextBlock Text="{Binding ItemCount, StringFormat=Count: {0}}"
                                               Margin="30,0,0,0" />
                                 </StackPanel>
                              </StackPanel>
                           </Expander.Header>
                           <Expander.Content>
                              <ItemsPresenter />
                           </Expander.Content>
                        </Expander>
                     </ControlTemplate>
                  </Setter.Value>
               </Setter>
            </Style>
         </GroupStyle.ContainerStyle>
      </GroupStyle>
   </DataGrid.GroupStyle>
</DataGrid>

DataGrid:

当您对 collection 视图进行分组时,组的数据上下文是 CollectionViewGroup。它公开了几个属性,例如 ItemCountName,这是您为当前组分组的 属性 的 。因此,如果您想将 Expander header 绑定到 DrawNr,请使用 Name.

<Expander.Header>
   <StackPanel>
      <StackPanel Orientation="Horizontal">
         <TextBlock Text="{Binding Name}" />
         <TextBlock Margin="30,0,0,0" Text="{Binding ItemCount, StringFormat=Count: {0}}" />
      </StackPanel>
   </StackPanel>
</Expander.Header>

至于check属性,一个组可以包含多个项目,所以check属性其中item exactly should be considered in the DataTrigger, first, a boolean And of all items, anything else?

在这里,我检查组中是否只有 一项 并使用它的 check 属性。如果是 TrueExpander 背景将为绿色。在所有其他情况下(也适用于不止一项),它将是红色的。

<Expander.Style>
   <Style TargetType="{x:Type Expander}">
      <Setter Property="Background" Value="Red" />
      <Style.Triggers>
         <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
               <Condition Binding="{Binding Items.Count}" Value="1" />
               <Condition Binding="{Binding Items[0].Check}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Green" />
         </MultiDataTrigger>
      </Style.Triggers>
   </Style>
</Expander.Style>

作为一般说明,广泛接受的 属性 名称约定是 Pascal-Case,例如Check.