【问题标题】:Custom Sort in WPF DataGrid using MVVM使用 MVVM 在 WPF DataGrid 中自定义排序
【发布时间】:2013-06-16 21:12:35
【问题描述】:

我有一个绑定到我的 ViewModel 集合的数据网格。它的一列具有非常特定于业务需求的值。在此列上,它可以包含字母数字字符。

例如,我可以有列值 A1、A20、AA、AA12、AAA。现在我想对这些值进行自定义排序,比如我希望字母最多的任何东西都应该排在第一位或等位。 DataGrid 有一个默认排序,但只进行正常排序。

我的问题是您将如何通过 MVVM 实现这一点?我们可以通过在后面的代码中订阅一个事件并重新安排整个集合来解决这个问题。但这不是我想要的,我正在寻找有关如何解决此问题的建议或解决方案。

我发现这个链接Sorting on datagrid column with binded data and converter 附加了一个DataGrid 的属性,但我想做的是附加一个属性,每次用户单击此列时都会更新。是否可以在 DataGrid 列中附加属性?

可能重复:Sorting on datagrid column with binded data and converter,但这不是使用 MVVM。

【问题讨论】:

  • 问题,您的数据网格是否自动生成列?您是否使用 DataGridText 列?简短的回答是将列的排序路径设置为不显示的属性,它将根据您的自定义要求进行排序。但你没有提供足够的信息来告诉
  • 感谢您的提问,我的列不是自动生成的,是的,我正在使用 DataGridText 列。
  • 嗨,Garry,很抱歉我没有回复这个。如果您在我能够将其标记为答案之前重新发布您添加的解决方案。
  • 您好,我已取消删除它。希望它能解决您的问题。如果没有,请大喊。

标签: c# wpf sorting mvvm datagrid


【解决方案1】:

有几种策略,但最直接的方法是设置一个类似这样的 DataGrid...

<DataGrid ItemsSource="{Binding DriveList}" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" SortMemberPath="DriveType"/>
    </DataGrid.Columns>
</DataGrid>

此示例显示了网格绑定到主机上的驱动器列表。第一列显示信息绑定到属性“名称”。 但是当您单击列标题时,它将对未显示的属性“DriveType”进行排序。奇怪的例子,但它工作正常。

因此,在您的应用程序中,您可以修改您的集合项以包含一个未显示的属性,并根据您的需要使用值填充它。在您问题的示例中,您可能会使用类似...

MySortString = MyName.ToString().Length;

这将导致排序执行您要查找的操作,即“MyName”的最长值将首先出现,然后是较短的值。每次更改排序方法或重新加载数据源时,都必须重新填充“MySortString”属性。

此策略与 MVVM 兼容,因为您在 VM 中所做的只是填充附加属性。另外,您可以立即使用 Nunit 或其他工具对其进行单元测试。

【讨论】:

  • 只是一个补充,显示或不显示的属性都可以。
  • 事后诸葛亮。使用模板列时,它需要在列上声明,而不是在模板本身中。
【解决方案2】:

我创建了一个附加行为,它以一种对 MVVM 友好的方式执行此操作:

WPF DataGrid CustomSort for each Column

希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2011-12-26
    • 2012-05-01
    • 2014-10-29
    • 2010-12-24
    • 2023-03-08
    • 2019-08-29
    • 2013-02-11
    相关资源
    最近更新 更多