Проблемы с использованием CollectionViewSource для группировки по сетке данных - PullRequest
1 голос
/ 16 июня 2019

Я уже некоторое время пытаюсь сгруппировать данные в своей сетке данных, но безуспешно.В моей 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>

1 Ответ

3 голосов
/ 16 июня 2019

Вот как я заставил это работать, но я хотел бы знать, есть ли и другой способ.

Я создал 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>).

...