WPF ListView - 按嵌套属性排序

时间:2009-07-23 19:07:41

标签: wpf sorting listview properties nested-properties

我最近遇到了一个问题,即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必须这样做。

2 个答案:

答案 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);
    }
}

(示例来源:https://wpftutorial.net/DataViews.html#sorting