c# - 使用 CollectionViewSource 在数据网格上进行分组的问题
问题描述
一段时间以来,我一直试图在我的数据网格中对数据进行分组,但没有成功。在我的 ViewModel 中,属性:
public ObservableCollection<CompetitorModel> Competitors { get; } =
new ObservableCollection<CompetitorModel>();
public CollectionViewSource CompetitorsCollectionView { get; } =
new CollectionViewSource();
在我的构造函数中:
CompetitorsCollectionView.Source = Competitors;
CompetitorsCollectionView.GroupDescriptions.Add(
new PropertyGroupDescription(nameof(CompetitorModel.Qualification)));
最后,我的 xaml 中的数据网格:
<Grid Background="#FFE5E5E5">
<!-- Datagrid Competition -->
<DataGrid x:Name="Datagrid_Competition"
ItemsSource="{Binding CompetitorsCollectionView}"
AutoGenerateColumns="False"
Grid.Column="2"
Grid.Row="3"
HorizontalGridLinesBrush="DarkGray"
VerticalGridLinesBrush="DarkGray"
IsReadOnly="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
CanUserResizeColumns="True"
CanUserDeleteRows="True"
CanUserAddRows="False">
<!-- Grouping Style -->
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
<!-- Column Information -->
<DataGrid.Columns>
<DataGridTextColumn Header="Place"
Binding="{Binding Path=Place}"
Width="45"
IsReadOnly="True"/>
<DataGridTextColumn Header="Username"
Binding="{Binding Path=Username}"
Width="120"/>
<DataGridTextColumn Header="VIStart"
Binding="{Binding Path=VIStart}"
Width="Auto"/>
<DataGridTextColumn Header="VIEnd"
Binding="{Binding Path=VIEnd}"
Width="Auto"/>
<DataGridTextColumn Header="VIs"
Binding="{Binding Path=VIs}"
Width="Auto"
IsReadOnly="True"/>
<DataGridTextColumn Header="Time"
Binding="{Binding Path=TimeFormated}"
Width="Auto"
IsReadOnly="True"/>
<DataGridTextColumn Header="Rerecords"
Binding="{Binding Path=Rerecords}"
Width="Auto"/>
<DataGridCheckBoxColumn Header="DQ"
Binding="{Binding Path=DQ}"
Width="30"/>
<DataGridTextColumn Header="DQReason"
Binding="{Binding Path=DQReasons}"
Width="Auto"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
我已经尝试了使用ListCollectionView
s 的各种方法,它们确实有效,但没有提供排序或有用的能力。话虽这么说,这就是我的工具看起来用 aListCollectionView
而不是 a CollectionViewSource
:
如果有人能指出我哪里出错了,我将不胜感激,因为我无法终生解决这个问题。目前,我能找到的其他帖子都没有解决我的问题。
编辑:我不知道解决问题是否重要,但在我的 中App.xaml
,我为我的数据网格分组定义了以下样式:
<!-- Datagrid Grouping Style -->
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="expander"
IsExpanded="True"
Background="DarkGray"
Foreground="Black"
BorderBrush="DarkGray"
BorderThickness="1.75"
Margin="0,5">
<Expander.Header>
<TextBlock Text="{Binding Name}"/>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
解决方案
这是我如何让它工作的,但我想知道是否还有另一种方法。
我创建了 的CompetitorCollection
属性ICollectionView
,并将其绑定到DataGrid ItemsSource
private ICollectionView _competitors;
public ICollectionView CompetitorCollection
{
get { return _competitors; }
}
在构造函数中
_competitors = CollectionViewSource.GetDefaultView(Competitors);
_competitors.GroupDescriptions.Add(new PropertyGroupDescription(nameof(CompetitorModel.Qualification)));
绑定CompetitorCollection
为DataGrid
项目源。
<DataGrid x:Name="Datagrid_Competition"
ItemsSource="{Binding CompetitorCollection}"
AutoGenerateColumns="False"
Grid.Column="2"
Grid.Row="3"
HorizontalGridLinesBrush="DarkGray"
VerticalGridLinesBrush="DarkGray"
IsReadOnly="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
CanUserResizeColumns="True"
CanUserDeleteRows="True"
CanUserAddRows="False">
替代方法
创建CollectionViewSource
内部Windows.Resource
<Window.Resources>
<CollectionViewSource x:Key="DQ" Source="{Binding Path=Competitors}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Qualification"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
然后在DataGrid
添加CollectionView
我们刚刚创建的ItemSource
<DataGrid x:Name="Datagrid_Competition"
ItemsSource="{Binding Source={StaticResource DQ}}"
AutoGenerateColumns="False"
Grid.Column="2"
Grid.Row="3"
HorizontalGridLinesBrush="DarkGray"
VerticalGridLinesBrush="DarkGray"
IsReadOnly="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
CanUserResizeColumns="True"
CanUserDeleteRows="True"
CanUserAddRows="False">
然后仅在 ViewModel 中Competitors
(类型为ObservableCollection<CompetitorModel>
)必须存在。
推荐阅读
- xamarin - 如何从数据表中显示列表视图?
- sql-server - 如何一般地创建分层xml
- c# - 为什么重新加载后datagridview的列大小不同
- apache-spark - Spark 流式处理在每小时 00:00 运行
- amazon - 大家好,是否可以在 Alexa 中访问“插入式”API 和联系人?
- azure - Azure Kubernetes 服务 ARM 模板不是幂等的
- math - 自定义权重排名机制
- database - 如何通过 liquibase Changelog File XML 调用 Oracle 存储过程
- python - 从文本字符串中解析元素(在列表中)
- c - 正则表达式检查网址