4

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

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

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

我找到了这个链接Sorting on datagrid column with binding data 和转换器,它附加了 DataGrid 的属性,但我想要做的是附加一个属性,每次用户单击此列时都会更新。是否可以在 DataGrid 列中附加属性?

可能重复:使用绑定数据和转换器对数据网格列进行排序,但这不使用 MVVM。

4

2 回答 2

7

有几种策略,但最直接的方法是设置一个像这样的 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 或其他任何方式对其进行单元测试。

于 2013-06-20T23:11:20.897 回答
1

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

每列的 WPF DataGrid CustomSort

希望这可以解决您的问题。

于 2013-08-14T10:42:15.143 回答