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

Slo*_*ong 0 c# wpf datagrid filter icollectionview

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

_displayItemsView = CollectionViewSource.GetDefaultView(_displayItems);

其中_displayItems是 aList并且_displayItemsView是ICollectionView。

现在我遇到的问题是我允许用户像这样过滤数据网格:

                        _displayItemsView.Filter = delegate(object item)
                        {
                            DISPLAY_ITEM displayItem = (DISPLAY_ITEM)item;
                            if ((displayItem.RETAIL_ITEM_DPCI.ToString().ToUpper().Contains(value.ToUpper()))
                                      .
                                      .
                                      .
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都很好用,但是如果用户当前正在编辑或DataGrid在ICollectionView. 我应该如何检测:

  1. 在DataGrid目前正在修改或
  2. 该ICollectionView不在状态,被过滤?

感谢任何指导,我对想法持开放态度。谢谢!

Gay*_*Fow 5

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

对于您的问题 2,当基础集合继承自 IList(ObservableCollection例如)时,您可以ListCollectionView通过 cast获得 a CollectionViewSource.GetDefaultView。

它ListCollectionView有几个属性,可以为您提供所需的信息......

  • CurrentEditItem并且CurrentAddItem当这些状态处于活动状态时将指向它们各自的对象。

  • IsAddingNew 会告诉您是否正在进行添加交易

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

  • IsInUse 会告诉是否有任何当前订阅者

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