WPF ListView-按嵌套属性排序
我最近偶然发现了一个问题,WPFWPF ListView-按嵌套属性排序,wpf,sorting,listview,properties,nested-properties,Wpf,Sorting,Listview,Properties,Nested Properties,我最近偶然发现了一个问题,WPFListView控件似乎限制了对其项进行排序的能力。具体来说,我在获取SortDescription以识别嵌套属性(属性的属性)时遇到了很多麻烦 对于按propreties进行的直接排序,应使用以下行: listView.Items.SortDescriptions.Add(new SortDescription("MyProperty", ListSortDirection.Ascending)); 事实上,它对我很有效。但是,由于myListView
ListView
控件似乎限制了对其项进行排序的能力。具体来说,我在获取SortDescription
以识别嵌套属性(属性的属性)时遇到了很多麻烦
对于按propreties进行的直接排序,应使用以下行:
listView.Items.SortDescriptions.Add(new SortDescription("MyProperty",
ListSortDirection.Ascending));
事实上,它对我很有效。但是,由于myListView的ItemSource
是一个(强类型)DataTable
,因此某些列绑定到行的嵌套属性(即row.OtherTableRow.Subperty
绑定路径样式)-这是ADO.NET数据集用于层次数据库的方式
我想做的是这样的:
listView.Items.SortDescriptions.Add(new SortDescription("MyProperty.SubProperty",
ListSortDirection.Ascending));
但不幸的是,该行抛出了一个ArgumentException
:
“Orders”类型没有名为“Row.[ID]”的属性,因此无法对数据收集进行排序
奇怪的是,绑定到嵌套属性没有问题。事实上,这些字段在列表视图中显示得非常好。。。将PropertyGroupDescription
添加到listView.GroupDescriptions
也不会给嵌套属性带来任何问题-这只是sortddescriptions
这只是WPF/列表视图控件的一个限制吗?作为框架的一部分,我有没有办法获得支持,或者我会在那里走运?如果我是不幸的,并且这种不一致性是不可避免的,如果有人能为这种嵌套属性的场景建议一种破解或解决方法,我将不胜感激。我已经尝试了一些想法,但都没有成功
注意:我意识到ORM可以很好地解决我的问题,但我担心这对于我目前正在进行的项目来说根本不可行。简单的ADO.NET数据集必须做。 < P>根据Windows演示基金会未出租(Adam Nathan)您可以将默认视图强制转换为ListCollectionView,并将自定义IComparer实现设置为其CustomSort属性。使用SortDescription
的替代方法是提供IComparer
对象SortDescription
显然依赖于反射,这可能就是嵌套属性根本无法正常工作的原因;但是,IComparer
方法没有这样的限制,提供了更大的灵活性,并且据说速度更快
使用IComparer
的诀窍在于ICollectionView
没有所需的.CustomSort
属性-但是在许多情况下(如果不是全部的话),您可以将默认视图强制转换为ListCollectionView
,从而公开所需的界面
例如,我有一个observateCollection
,其默认视图可以转换为ListCollectionView
。我认为,如果这适用于ObservableCollection
,那么它可能适用于大多数场景
下面是一个例子:
ListCollectionView _customerView = CollectionViewSource.GetDefaultView(customers);
as ListCollectionView;
_customerView.CustomSort = new CustomerSorter();
public class CustomerSorter : IComparer
{
public int Compare(object x, object y)
{
Customer custX = x as Customer;
Customer custY = y as Customer;
return custX.Name.CompareTo(custY.Name);
}
}
(示例来源:)为此干杯。我可以看看那本书,如果它能很好地涵盖其他高级场景的话