一段时间以来,我一直试图在我的数据网格中对数据进行分组,但没有成功。在我的 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,它确实有效,但没有提供排序或有用的能力。话虽这么说,这就是我的工具看起来像 ListCollectionView
而不是 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
的属性(property),并将其绑定(bind)到 DataGrid ItemsSource
private ICollectionView _competitors;
public ICollectionView CompetitorCollection
{
get { return _competitors; }
}
在构造函数中
_competitors = CollectionViewSource.GetDefaultView(Competitors);
_competitors.GroupDescriptions.Add(new PropertyGroupDescription(nameof(CompetitorModel.Qualification)));
绑定(bind)
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>
)必须存在。
关于c# - 使用 CollectionViewSource 在数据网格上进行分组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615349/