Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
WPF ListView-按嵌套属性排序_Wpf_Sorting_Listview_Properties_Nested Properties - Fatal编程技术网

WPF ListView-按嵌套属性排序

WPF 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

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

对于按propreties进行的直接排序,应使用以下行:

listView.Items.SortDescriptions.Add(new SortDescription("MyProperty",
    ListSortDirection.Ascending));
事实上,它对我很有效。但是,由于my
ListView的
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);
    }
}

(示例来源:)

为此干杯。我可以看看那本书,如果它能很好地涵盖其他高级场景的话