首页 > 解决方案 > WPF GROUPED Datagrid:如何通过 vm 属性对组本身进行排序?

问题描述

场景:用于显示来自自定义源的自定义事件的数据网格。网格必须按源对行进行分组,按日期时间降序对事件进行排序(较新的总是在顶部)。不允许手动排序,启用虚拟化,MVVM 模式。这是我的问题:组头本身必须遵循日期时间排序,即包含最新事件的组必须缩放到顶部。

视图模型:

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 组将在网格顶部缩放:如何获得这个?

更新:我们将链接转移到示例项目

标签: c#wpfsortingdatagridgrouping

解决方案


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();
    }

对不起,之前误解了你的问题。


推荐阅读