我有一个绑定到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。
答案 0 :(得分:7)
有几种策略,但最容易访问的是设置一个像这样的DataGrid ......
<DataGrid ItemsSource="{Binding DriveList}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" SortMemberPath="DriveType"/>
</DataGrid.Columns>
</DataGrid>
此示例显示网格绑定到主机上的驱动器列表。第一列显示信息绑定到属性“名称”。单击列标题时, BUT 将对未显示的属性“DriveType”进行排序。奇怪的例子,但它运作正常。
因此,在您的应用中,您将修改您的收藏项目以包含未显示的属性,并根据您的需要使用值填充它。在您的问题的示例中,您可能会使用类似......
的内容MySortString = MyName.ToString().Length;
这将导致排序执行您正在寻找的内容,即,“MyName”的最长值将首先使用较短的值。每次更改排序方法或重新加载数据源时,都必须重新填充“MySortString”属性。
此策略符合MVVM,因为您在VM中所做的只是填充其他属性。另外,您可以使用Nunit或其他任何方式对其进行单元测试。
答案 1 :(得分:1)