如何判断ICollectionView当前是否可过滤
本文关键字:是否 过滤 ICollectionView 何判断 判断 | 更新日期: 2023-09-27 18:02:06
我将DataGrid
的ItemsSource
属性绑定到我的ViewModel中的属性。然后,我创建一个ICollectionView
,并使用DataGrid
的项目源创建一个默认视图,如下所示:
_displayItemsView = CollectionViewSource.GetDefaultView(_displayItems);
,其中_displayItems
为List
, _displayItemsView
为ICollectionView
。
现在我遇到的问题是,我允许用户过滤数据网格,如下所示:
_displayItemsView.Filter = delegate(object item)
{
DISPLAY_ITEM displayItem = (DISPLAY_ITEM)item;
if ((displayItem.RETAIL_ITEM_DPCI.ToString().ToUpper().Contains(value.ToUpper()))
.
.
.
这在大多数情况下工作得很好,但是如果用户当前正在编辑或添加DataGrid
中的一行,ICollectionView
会抛出未处理的异常。我该如何检测呢?
-
DataGrid
当前正在修改或 -
ICollectionView
不处于待过滤状态?
任何指导都是赞赏的,我是开放的想法。谢谢!
对于您的问题1,WPF DataGrid提供了可用的事务语义。如果绑定集合中的对象实现了IEditableObject
,那么代码将获得三个通知:开始编辑、结束编辑和取消编辑。您可以跟踪这些通知并实现一些内务管理代码来判断DataGrid是否正在被修改。根据您的设计,您需要设置DataGrid的SelectionUnit
/SelectionMode
属性以与您想要的通知一致。
对于您的问题2,当底层集合继承自IList(例如ObservableCollection
)时,您可以通过转换CollectionViewSource.GetDefaultView
来获得ListCollectionView
。
ListCollectionView
上面有几个属性,可以给你需要的信息…
-
CurrentEditItem
和CurrentAddItem
将分别指向它们 -
IsAddingNew
将告诉您是否添加事务正在进行中 -
IsEditingItem
将告诉您是否有编辑事务正在进行 -
IsInUse
将告诉是否有当前的订户
使用这些属性和IEditableObject接口将为您提供避免异常所需的所有信息。