Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVVM在WPF数据网格中进行自定义排序_C#_Wpf_Sorting_Mvvm_Datagrid - Fatal编程技术网

C# 使用MVVM在WPF数据网格中进行自定义排序

C# 使用MVVM在WPF数据网格中进行自定义排序,c#,wpf,sorting,mvvm,datagrid,C#,Wpf,Sorting,Mvvm,Datagrid,我有一个绑定到ViewModel集合的datagrid。其中一列具有非常特定于业务需求的值。在此列上,它可以包含字母数字字符 例如,我可以有列值A1、A20、AA、AA12、AAA。现在,我想对这些值进行自定义排序,比如说,我想让字母最多的任何东西都应该排在前面,或者排在前面。DataGrid有一个默认排序,但只执行正常排序 我的问题是,您将如何通过MVVM实现这一点?我们可以通过在code behind中订阅一个事件并重新安排整个集合来解决这个问题。然而,这不是我想要的,我正在寻找关于如何实现

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

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

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

我发现这个链接正在为DataGrid附加一个属性,但我想做的是附加一个属性,该属性将在用户每次单击此列时更新。是否可以在DataGrid列中附加属性


可能重复:但这不是使用MVVM

有几种策略,但最直接的方法是建立一个类似这样的数据网格

<DataGrid ItemsSource="{Binding DriveList}" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" SortMemberPath="DriveType"/>
    </DataGrid.Columns>
</DataGrid>
这将导致排序执行您正在查找的操作,即“MyName”的最长值将位于第一位,之后是较短的值。每次更改排序方法或重新加载数据源时,都必须重新填充“MySortString”属性


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

我创建了一个附加行为,它以一种友好的MVVM方式实现了这一点:


希望这能解决您的问题。

问题,您的datagrid是否自动生成列?您正在使用DataGridText列吗?简单的回答是将列的排序路径设置为未显示的属性,它将根据您的自定义要求进行排序。但是你没有提供足够的信息告诉我谢谢你的提问,我的专栏不是自动生成的,是的,我使用的是DataGridText专栏。嗨,Garry,很抱歉我没有得到这个。如果你重新发布你之前添加的解决方案,我将能够将其标记为答案。您好,我已取消删除它。希望它能解决你的问题。如果不显示,则呼喊。只是添加,显示或未显示的属性都将起作用。事后考虑。使用模板列时,需要在列上声明,而不是在模板本身中声明。
MySortString = MyName.ToString().Length;