数据绑定 WPF ListView 的自定义排序






3.57/5 (10投票s)
为 ADO.NET 绑定的 WPF ListView 提供自定义排序
引言
WPF 是一种全新的技术,用于构建丰富的用户界面。整个控件范围也提供了更简单的开发体验。最近,我们遇到了一个问题,我们有一个用于网格屏幕的 WPF ListView,它绑定到 ADO.NET 数据集。该网格为用户提供了排序、过滤和其他操作的功能。但是,所有字段都被视为文本值进行排序。在尝试对包含整数值的列进行排序时,这会出现问题。
背景
ADO.NET 绑定的 ListView 的正常排序使用默认排序行为,将所有数据视为字符串。以下是相同的示例代码。
Dim lv as ListView ‘assume you already have a ListView reference which is lv
Dim myView as ICollectionView = CollectionViewSource.GetDefaultView (lv.ItemsSource)
Dim mySortColumn as string = “sortcolumn” ‘Let mySortColumn let be name of column to sort on
myView.SortDescriptions.Add (new sortdescription (mySortColumn, ListSortDirection.Ascending)
myView.Refresh ()
这是通过列(例如上面的“sortcolumn”)对 ListView 进行排序的默认方法。但是,如果您想根据自己的自定义逻辑对 ListView 执行一些自定义排序,该怎么办?
解决方案和代码
有关 WPF ListView 行为的良好参考可以在 此处 的文章中找到
参考以上文章,如果绑定源实现 IList,则可以将上面的 ICollectionView
强制转换为 ListCollectionView.ListCollectionView
,它有一个 Customsort 属性,您可以将自定义排序类的实例分配给它,该实例实现 IComparable
。
但是,如果您已将 ListView 绑定到 IBindingList
的实例,例如 Dataview,则上面的 ICollectionView
是 BindingListCollectionView
的情况,它没有自定义排序属性。此视图将排序、过滤等的逻辑委托给底层 dataview。
为了实现自定义排序,我们使用了可以通过以下方式获得的底层 dataview:
Dim myDataView as DataView = TryCast (myView.SourceCollection, DataView)(myView is of type ICollectionView as above)
现在创建一个实现 IComparable 的类,它将具有您的自定义排序逻辑。此类应该有一个重写的 ToString 方法,该方法返回类的自定义 ToString 表示形式,并且应该实现 CompareTo
方法。 示例如下。
Public class CustomComparer
Implements IComparable
Private _Value as Object ‘This is the internal value stored in the class
Public function CompareTo (value as Object) as Integer implements IComparable. CompareTo
在此处放置您的自定义排序逻辑
End function
Public overrides function ToString () as String
End function
End Class
现在,为绑定 dataview 的底层数据表添加一个新列,其类型为上面的类,并为 dataview 的每个 DataRowView 的新列添加此类的新实例..即。
‘ 伪代码
For each row as DataRowView in myView
Dim myNewClass as New CustomComparer()
Row(myNewColumnName) = myNewClass
Next
接下来,执行与上述排序相同的逻辑,但对于排序列,添加您在上面添加的新列,而不是实际列,即,
Dim mySortColumn as string = “sortcolumn” ‘Where mySortColumn is the name of column just added to the view above.
myView.SortDescriptions.Add (new sortdescription (mySortColumn, ListSortDirection.Ascending)
myView.Refresh ()
视图现在将按提供的新列进行排序,并将调用自定义类的 CompareTo 方法,即上面的 CustomComparer 来执行排序。
总结
自定义排序可能是网格控件的常见要求。虽然我没有声称这是解决上述问题的唯一解决方案,但这是一个简单的解决方案,可以达到我们想要的效果。
注意:请注意,上面的代码只是为了向用户提供有关实现细节的想法,并且大多是伪代码(使用 VB.NET 语法)。请从上面的示例中在您的开发 IDE 中完整开发代码。