我最近遇到了一个问题,即WPF ListView
控件似乎限制了对其项目进行排序的能力。具体来说,我在尝试让SortDescription
识别嵌套属性(属性的属性)方面遇到了很多麻烦。
对于按行为进行的直接排序,以下行应该完成这项工作:
listView.Items.SortDescriptions.Add(new SortDescription("MyProperty",
ListSortDirection.Ascending));
确实对我来说效果很好。但是,因为ItemSource
的{{1}}是(强类型)ListView
,所以某些列绑定到行的嵌套属性(即DataTable
绑定路径样式) - 这是ADO.NET DataSet对分层数据库的工作方式。
我想做的是这样的事情:
Row.OtherTableRow.SubProperty
但不幸的是,该行会引发listView.Items.SortDescriptions.Add(new SortDescription("MyProperty.SubProperty",
ListSortDirection.Ascending));
:
'Orders'类型没有名为'Row。[ID]'的属性,因此无法对数据集合进行排序。
奇怪的是,我没有问题绑定到嵌套属性。实际上,这些字段在ArgumentException
中显示得非常好...也没有向ListView
添加PropertyGroupDescription
给我任何嵌套属性的问题 - 它只是listView.GroupDescriptions
!< / p>
这是WPF / SortDescriptions
控件的限制吗?有什么方法我会得到支持作为框架的一部分,还是我会在那里运气不好?如果我不幸的是,这种不一致是不可避免的,如果有人能为这种嵌套属性的场景建议一个黑客或解决方法,我将不胜感激。我已经尝试了一些想法,但都收效甚微。
注意:我意识到ORM可能很好地解决了我的问题,但我担心这对我正在进行的当前项目来说根本不可行。简单的ADO.NET DataSet必须这样做。
答案 0 :(得分:2)
根据Windows Presentation Foundation Unleashed(Adam Nathan),您可以将默认视图转换为ListCollectionView,并将自定义IComparer实现设置为其自定义排序属性。
答案 1 :(得分:1)
使用SortDescription
的另一种方法是提供一个IComparer
对象。 SortDescription
显然依赖反射,这可能就是为什么嵌套属性根本无法正常工作的原因;但是IComparer
方法没有这种限制,提供了更大的灵活性,并且据称也更快。
使用IComparer
的技巧是ICollectionView
没有所需的.CustomSort
属性-但是在许多(如果不是全部?)情况下,您可以使用默认值查看到 ListCollectionView
,其中显示了所需的界面。
例如,我有一个ObservableCollection<Something>
,其默认视图 可以强制转换为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);
}
}