首页 > 解决方案 > 如何在基于 DataTrigger 的 DataGrid 中为 Expander 着色?

问题描述

ExpanderDataGrid基于DataTrigger. 我已经尝试了很多东西并红色了很多线程,但没有运气。

我希望颜色根据ItemsSource.

下面是设置的代码ItemsSource

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

   MyDataGrid.ItemsSource = ColectList;
}

下面是我的 XAML(这check是我在 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: _

数据网格的屏幕截图。

标签: c#wpfbindingdatagriddatatrigger

解决方案


当您对集合视图进行分组时,组的数据上下文是CollectionViewGroup. 它公开了几个属性,例如ItemCountor Name,它是您为当前组分组的属性的。因此,如果要将Expander标头绑定到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究竟应该考虑哪个项目的属性DataTrigger,第一个,布尔值和所有项目,还有什么?

在这里,我检查组中是否只有一个项目并使用它的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.


推荐阅读