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

标签 c# wpf mvvm datagrid grouping

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

相关文章:

c# - 我的 ViewModel 知道 View,我该如何解决这个问题?

c# - 带参数的命令

c# - Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException

c# - 由于在另一个线程中创建 ReportViewr 而导致窗口布局更改时,在非常复杂的 WPF 应用程序中卡在未知位置

c# - 在 C# 中从 Math.Sqrt 获取不同的输出

wpf - DoDragDrop() - droptarget 是另一个应用程序(word 或 excel)

c# - Web.config错误(system.serviceModel)

c# - 有什么方法可以设置 ResourceDictionary 键以匹配类名?

xamarin.forms - 如何从 Xamarin 表单中的 DataTemplate 条目 TextChanged 事件调用命令?

c# - WPF:如何将 Unicode 字符转移到共享资源中?