4

我最近偶然发现了 WPFListView控件似乎限制了对其项目进行排序的能力的问题。具体来说,我在尝试SortDescription识别嵌套属性(属性的属性)时遇到了很多麻烦。

对于按属性直接排序,以下行应该可以完成工作:

listView.Items.SortDescriptions.Add(new SortDescription("MyProperty",
    ListSortDirection.Ascending));

确实它对我很有效。但是,因为ItemSourcefor myListView是 (strongly-typed) DataTable,所以某些列绑定到行的嵌套属性(即Row.OtherTableRow.SubProperty绑定路径样式) - 这是 ADO.NET 数据集用于分层数据库的方式。

我想做的是这样的:

listView.Items.SortDescriptions.Add(new SortDescription("MyProperty.SubProperty",
    ListSortDirection.Ascending));

但不幸的是,该行抛出一个ArgumentException

“订单”类型没有名为“行。[ID]”的属性,因此无法对数据集合进行排序。

奇怪的是,绑定到嵌套属性没有问题。实际上,这些字段在...中显示得非常好ListView......添加 a 也不会给我任何嵌套属性的问题 - 它只是!PropertyGroupDescriptionlistView.GroupDescriptionsSortDescriptions

这只是 WPF/ListView控件的限制吗?作为框架的一部分,我有什么方法可以获得支持,还是我会不走运?如果不幸的是,并且这种不一致是不可避免的,那么如果有人可以针对这种嵌套属性的场景提出破解或解决方法,我将不胜感激。我已经尝试了一些想法,但都收效甚微。

注意:我意识到 ORM 可以很好地解决我的问题,但恐怕这对于我正在从事的当前项目来说根本不可行。必须使用简单的 ADO.NET 数据集。

4

2 回答 2

2

根据 Windows Presentation Foundation Unleased (Adam Nathan),您可以将默认视图转换为 ListCollectionView 并将自定义 IComparer 实现设置为其 CustomSort 属性。

于 2009-07-23T21:44:10.117 回答
1

使用的替代方法SortDescription提供一个IComparer对象SortDescription显然依赖于反射,这可能就是嵌套属性无法正常工作的原因;但该IComparer方法没有这样的限制,提供了更多的灵活性,并且声称也更快。

使用的技巧IComparer是它ICollectionView没有所需的.CustomSort属性 - 但是在许多(如果不是全部?)情况下,您可以将默认视图转换为 ListCollectionView 公开所需接口的 a 。

例如,我有一个可以ObservableCollection<Something>将其默认视图转换为. 我认为这是否适用于大多数情况。ListCollectionViewObservableCollection

这是一个例子:

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 )

于 2020-05-15T13:04:31.037 回答