WPF GROUPED Datagrid: как отсортировать группы по свойству vm? - PullRequest
0 голосов
/ 23 ноября 2018

Сценарий: таблица данных для отображения пользовательских событий из пользовательских источников.Сетка должна группировать строки по источнику, упорядочивая события по дате и времени по убыванию (более новые всегда сверху).Ручная сортировка не разрешена, виртуализация включена, шаблон MVVM.Вот моя проблема: сам заголовок группы должен следовать порядку даты и времени, то есть группа, связывающаяся с последним событием, должна масштабироваться до верха.

ViewModel:

public class Event
{
   public Int32 Source_Id { get; set; }
   public String Source_Name { get; set; }
   public DateTime Event_DateTime { get; set; }
}

CollectionView сгруппирован по Source_Id иотсортировано по Event_DateTime:

<CollectionViewSource x:Key='alarms_src' Source="{Binding Alarms}">                
   <CollectionViewSource.GroupDescriptions>
      <PropertyGroupDescription PropertyName="Source_Id" />
   </CollectionViewSource.GroupDescriptions>
   <CollectionViewSource.SortDescriptions>
      <scm:SortDescription PropertyName="Event_DateTime" Direction="Descending" />
   </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

GroupStyle - это простой расширитель с именем источника и датой и временем последнего события в заголовке:

<DataGrid.GroupStyle>
    <GroupStyle>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Margin" Value="4"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander IsExpanded="True" Background="LightGray">
                                <Expander.Header>

                                    <StackPanel Orientation="Horizontal" Background="Transparent">

                                        <TextBlock Margin="8" Text="{Binding Items[0].Source_Name}"/>
                                        <TextBlock Margin="8" Text="{Binding Items[0].Event_DateTime}"/>

                                    </StackPanel>
                                </Expander.Header>

                                <Expander.Content>
                                    <ItemsPresenter/>
                                </Expander.Content>

                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>                
</DataGrid.GroupStyle>

Вывод: упрощенная сетка

Красные стрелки на изображении указывают на 4-ую сгенерированную мной строку с последней отметкой времени.Сетка правильно группирует и сортирует ВНУТРИ каждой группы, но я ожидаю, что группа Device_1 будет масштабироваться в верхней части сетки: как это получить?

Обновление: ссылка для переноса данных на образец проекта

1 Ответ

0 голосов
/ 28 ноября 2018
CollectionViewSource.GetDefaultView(testdg.ItemsSource).Refresh(); 

Здесь testdg - это мое имя элемента управления DataGrid.

Я подумал о том, чтобы обновить источник данных в сетке данных, а остальная сортировка будет выполнена.Оформить заказ методом.

    private void addEvent(Int32 source)
    {
        Event a = new Event();
        a.Source_Id = source;
        a.Source_Name = "Device_" + source.ToString();
        a.Event_DateTime = DateTime.Now;

        this.Alarms.Add(a);
        CollectionViewSource.GetDefaultView(testdg.ItemsSource).Refresh();
    }

Извините, неправильно понял ваш вопрос ранее.

...