如何判断ICollectionView当前是否可过滤

本文关键字:是否 过滤 ICollectionView 何判断 判断 | 更新日期: 2023-09-27 18:02:06

我将DataGridItemsSource属性绑定到我的ViewModel中的属性。然后,我创建一个ICollectionView,并使用DataGrid的项目源创建一个默认视图,如下所示:

_displayItemsView = CollectionViewSource.GetDefaultView(_displayItems);

,其中_displayItemsList, _displayItemsViewICollectionView

现在我遇到的问题是,我允许用户过滤数据网格,如下所示:

                        _displayItemsView.Filter = delegate(object item)
                        {
                            DISPLAY_ITEM displayItem = (DISPLAY_ITEM)item;
                            if ((displayItem.RETAIL_ITEM_DPCI.ToString().ToUpper().Contains(value.ToUpper()))
                                      .
                                      .
                                      .

这在大多数情况下工作得很好,但是如果用户当前正在编辑或添加DataGrid中的一行,ICollectionView会抛出未处理的异常。我该如何检测呢?

  1. DataGrid当前正在修改或
  2. ICollectionView不处于待过滤状态?

任何指导都是赞赏的,我是开放的想法。谢谢!

如何判断ICollectionView当前是否可过滤

对于您的问题1,WPF DataGrid提供了可用的事务语义。如果绑定集合中的对象实现了IEditableObject,那么代码将获得三个通知:开始编辑、结束编辑和取消编辑。您可以跟踪这些通知并实现一些内务管理代码来判断DataGrid是否正在被修改。根据您的设计,您需要设置DataGrid的SelectionUnit/SelectionMode属性以与您想要的通知一致。

对于您的问题2,当底层集合继承自IList(例如ObservableCollection)时,您可以通过转换CollectionViewSource.GetDefaultView来获得ListCollectionView

ListCollectionView上面有几个属性,可以给你需要的信息…

  • CurrentEditItemCurrentAddItem将分别指向它们

  • IsAddingNew将告诉您是否添加事务正在进行中

  • IsEditingItem将告诉您是否有编辑事务正在进行

  • IsInUse将告诉是否有当前的订户

使用这些属性和IEditableObject接口将为您提供避免异常所需的所有信息。