c# - 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 组将在网格顶部缩放:如何获得这个?
更新:我们将链接转移到示例项目
解决方案
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();
}
对不起,之前误解了你的问题。
推荐阅读
- java - 从生产者消息中提取时间戳
- superset - 通过 filter_box 或其他一些机制进行负过滤
- c++ - 我的 Pong 游戏在 C++ 中收到无响应警告
- c# - 我可以使用 Swashbuckle 从 Blazor 项目 c# 生成 Swagger UI
- java - 未在可执行 jar 中加载的库
- django - Django Views 不合作提交表单
- calculator - hp prime 计算器 RPN 模式 x^y 函数错误
- powershell - 无法完全正确地获取 PowerShell 管道语法
- scala - 一个动作如何使用类型来传达它没有主体?
- react-native - 反应原生如何在单个元素上使用多个动画