gpt4 book ai didi

c# - 使用 CollectionViewSource 在数据网格上进行分组的问题

转载 作者:行者123 更新时间:2023-12-03 10:25:34 26 4
gpt4 key购买 nike

一段时间以来,我一直试图在我的数据网格中对数据进行分组,但没有成功。在我的 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 :
enter image description here

如果有人能指出我哪里出错了,我将不胜感激,因为我无法终生解决这个问题。目前,我能找到的其他帖子都没有解决我的问题。

编辑:我不知道这对解决问题是否重要,但在我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com