记住 WPF DataGrid 排序顺序

2023-12-21

这是一个延续这个问题 https://stackoverflow.com/questions/34661767/binding-properties-width-sorting-of-datagrid-on-dynamic-tabpage.

1. Setup

我有一个 wpf 窗口,其中包含TabControl具有动态创建的项目。这ItemSource这个的TabControl绑定到一个列表Groups。这些组包含显示在DataGrid on the TabPage.

XAML:

<Window x:Name="window" x:Class="TestWpf.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:TestWpf"
    Title="MainWindow" Height="350" Width="525">
    <TabControl x:Name="tabControl" BorderThickness="0" ItemsSource ="{Binding Groups, ElementName=window, NotifyOnSourceUpdated=True}">
        <TabControl.ItemTemplate>
            <DataTemplate DataType="{x:Type vm:Group}">
                <TextBlock Padding="2" Text="{Binding Name}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate x:Name="contentTemplate" DataType="{x:Type vm:Group}">
                <DataGrid x:Name="dgElements" ItemsSource="{Binding Elements, BindsDirectlyToSource=True}" DockPanel.Dock="Top" AutoGenerateColumns="False" >
                    <DataGrid.Columns>
                        <DataGridTextColumn x:Name="clmName" Header="Name" Binding="{Binding Name}" IsReadOnly="True" CanUserReorder="False" />
                    <DataGridTextColumn x:Name="clmDesc" Header="Description" Binding="{Binding Description}" IsReadOnly="True" CanUserReorder="False" />
                    </DataGrid.Columns>
                </DataGrid>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
</Window>

这一切都很好。

2. 问题

The DataGrid allows 多列开箱即用。但不幸的是,如果我在标签页之间切换,排序就会丢失。
我想要的是为每个选项卡页/数据网格维护多列排序.

可以绑定SortDirection of DataGridTextColumn到一个属性,但不记得排序的列。调试发现,当我切换标签页时,SortDirection已重置before新的ItemSource已设置,所以我无法存储它。

问题是:如何保留每个选项卡页/数据网格的多列排序设置?


看了很多文章几乎解决了我的问题,我终于找到了解决方案。
我继承了我自己的类DataGrid并存储了SortDescriptions per ItemSource in a Dictionary:

public class SortKeepingDataGrid : DataGrid
{
    // Dictionary to keep SortDescriptions per ItemSource
    private readonly Dictionary<object, List<SortDescription>> m_SortDescriptions =
        new Dictionary<object, List<SortDescription>>();

    protected override void OnSorting(DataGridSortingEventArgs eventArgs)
    {
        base.OnSorting(eventArgs);
        UpdateSorting();
    }
    protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
    {
        base.OnItemsSourceChanged(oldValue, newValue);

        ICollectionView view = CollectionViewSource.GetDefaultView(newValue);
        view.SortDescriptions.Clear();

        // reset SortDescriptions for new ItemSource
        if (m_SortDescriptions.ContainsKey(newValue))
            foreach (SortDescription sortDescription in m_SortDescriptions[newValue])
            {
                view.SortDescriptions.Add(sortDescription);

                // I need to tell the column its SortDirection,
                // otherwise it doesn't draw the triangle adornment
                DataGridColumn column = Columns.FirstOrDefault(c => c.SortMemberPath == sortDescription.PropertyName);
                if (column != null)
                    column.SortDirection = sortDescription.Direction;
            }
    }

    // Store SortDescriptions in dictionary
    private void UpdateSorting()
    {       
        ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
        m_SortDescriptions[ItemsSource] = new List<SortDescription>(view.SortDescriptions);
    }
}

所以,基本上,每当用户更改排序时,我都会调用UpdateSorting并存储当前SortDescriptions 在每ItemSource字典。
当。。。的时候ItemSource已经改变了,我查了一下SortDescriptions 并按正确的顺序重置它们。

棘手的部分是找到正确的DataGridColumn设置其SortDirection。这是绘制三角形装饰所必需的。我在这里依赖于平等SortMemberPath and PropertyName。最终可能需要一种更通用的方法。

在 XAML 中我替换了DataGrid和我的SortKeepingDataGrid现在排序是按标签页存储的。

由于我找不到任何其他解决方案,也许这对其他人也有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记住 WPF DataGrid 排序顺序 的相关文章

随机推荐

  • 使用 SQLAlchemy declarative_base() 在 VS Code 中“继承‘Base’,这不是一个类”

    VS 代码显示 继承 Base 它不是一个类 作为错误消息 给出以下内容 from sqlalchemy ext declarative import declarative base from sqlalchemy import Inte
  • Cython“无法获取内存视图切片的地址”

    我在 Cython 中创建一个简单的类时遇到问题 与处理 C 包装器中数组的内存视图相关的文档很少 我想创建一个具有时间 x y 和 z 属性的数据类 我需要这些属性是数组 最终可以在 Python 中调用 我以前使用 numpy 类型进行
  • Java 中的本福德定律 - 如何将数学函数放入 Java 中

    我有一个快速的问题 我正在尝试用java制作一个欺诈检测应用程序 该应用程序将主要基于本福德定律 本福德定律非常酷 它基本上可以解释为在真实的金融交易中 第一个数字通常是 1 2 或 3 很少是 8 9 我还没能得到本福德公式翻译成可以在J
  • 从服务器,如何识别 javascript fetch() 调用(asp.net mvc)

    这并不完全是重复的 下面提供的答案与提议的重复答案中的评论相同 从 asp net 控制器操作内部 我有兴趣了解该调用是否是由 javascript fetch 调用进行的 我可以询问 Request 对象的任何部分来发现这一点吗 例如 如
  • 我应该为 PayPal 沙盒使用什么用户名/密码/签名?

    我正在尝试使用 Paypal NVP API 退款交易 我在沙盒帐户中收到了一些付款 但是当我尝试通过 API 发放退款时 我得到了You do not have permissions to make this API call 但我不确
  • 使用 AVPlayer-Swift 无缝循环视频

    我正在使用 AVPlayer 在后台循环播放本地视频 视频播放正常 但完成视频后需要暂停才能循环播放视频 我尝试了很多方法 也看到了很多关于堆栈溢出的帖子 但我未能找到合适的解决方案 我正在使用 Swift3 代码在这里 var video
  • 使用 openxlsx 导入多个 Excel 工作表

    我正在尝试将一个大型 xlsx 文件导入到包含许多数据表的 R 中 我试图通过这样做XLConnect 但是java内存问题 比如描述的那些在这个线程中 https stackoverflow com questions 21937640
  • 当应用程序处于后台时,单击通知时不会调用 fcm.onNotification()

    我已经安装了 cordova plugin fcm 除了一件小事外 一切正常 当应用程序处于后台 关闭并且从 firebase 发送推送通知时 通知会在设备中弹出 单击托盘中的该通知后 我的应用程序开始运行 但控件未进入 fcm onNot
  • 将 HTML 表导出到 Excel 时编码 UTF-8

    我正在尝试使用 javascript 将 HTML 表导出到 Excel 这是 JavaScript 代码
  • while 循环不会以逻辑条件终止

    如果我添加 OR 条件语句 该循环将不会终止 如果其中一个为假 那么它应该终止 全局变量 int x 100 char n malloc 64 void add void do printf Would you like to add 1
  • 100vw DIV 未显示全宽

    我正在努力让灰色div id ex home bottom container 朝向本页底部http patrickbaker biz starter d http patrickbaker biz starter d 整页的宽度 这意味着
  • 在 woocommerce_get_price_html 挂钩中的价格后添加多语言文本

    我正在构建一个 WooCommerce 网站并对其进行自定义 从互联网库复制并粘贴代码 我已成功在 woocommerce 产品中添加 自定义价格和自定义文本 以便可以将它们翻译成不同的语言 这是产品页面的外观 https www prim
  • 从 Internet 下载 URL 中具有特定日期时间的图像

    我正在尝试开发一个应用程序 该应用程序将使用生成的 Url 路径从 Web 服务器获取文件 网络服务器上每秒都会创建一个新文件 我正在尝试访问该文件并将其显示在 PictureBox 中 旧文件不会被删除 我遇到了一些问题 服务器返回404
  • 使用 linq 检查列表计数是否一致

    州有城市 只有在没有平局的情况下 我才需要拥有大多数城市的州 并列意味着排名前 2 的州拥有相同数量的城市 var stateWithMostCities states OrderByDescending p gt p cities Cou
  • 未找到 PHP 类 DateTime

    声明 DateTime 对象时缺少某些内容PHP 5 3 8 我得到一个带有确定日期时间的 JSON 字符串 该字符串被传递到我的 php 控制器 由于某种原因 我没有将其映射为 php 中的 DateTime 对象 但有点奇怪 请参阅以下
  • 转换为 YUV / YCbCr 色彩空间 - 许多版本

    有许多不同的 YUV 颜色转换 但它们都有不同的结果 哪一个是官方正确的 这是我的测试程序的输出 我输入 R 128 G 50 B 50 最大值为 255 该表显示了转换后的 YUV 值和重新转换后的 RGB 值 与原始值不匹配 Colou
  • Javascript d3 从 csv 读取

    好的 所以我对 javascript 有点菜鸟 我需要从 csv 读取数据以使用 d3 制作条形图 条形图对我来说没有问题 从 csv 文件中读取是问题 这是我的代码 var dataset d3 csv gender ratio csv
  • 如何在 keycloak docker 容器中进行数据库备份

    我使用 docker 安装了 keycloakdjango project docker run p 8080 8080 e KEYCLOAK USER admin e KEYCLOAK PASSWORD admin jboss keycl
  • 如何将属性绑定到WPF中Treeview中选定的节点

    如何将自定义属性绑定到MVVM中选定节点的IsSelected属性 我已在运行时将节点加载到树视图中 我正在使用MVVM 这是一个小例子 public abstract class ViewModel INotifyPropertyChan
  • 记住 WPF DataGrid 排序顺序

    这是一个延续这个问题 https stackoverflow com questions 34661767 binding properties width sorting of datagrid on dynamic tabpage 1