如何基于 DataTrigger 为 DataGrid 中的 Expander 着色?
How to color Expander in a DataGrid based on a DataTrigger?
我在根据 DataTrigger
为 DataGrid
中的 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
。它公开了几个属性,例如 ItemCount
或 Name
,这是您为当前组分组的 属性 的 值 。因此,如果您想将 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
属性。如果是 True
,Expander
背景将为绿色。在所有其他情况下(也适用于不止一项),它将是红色的。
<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
.
我在根据 DataTrigger
为 DataGrid
中的 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
。它公开了几个属性,例如 ItemCount
或 Name
,这是您为当前组分组的 属性 的 值 。因此,如果您想将 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
属性。如果是 True
,Expander
背景将为绿色。在所有其他情况下(也适用于不止一项),它将是红色的。
<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
.