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

时间:2014-05-06 18:32:46

标签: c# wpf datagrid filter icollectionview

我将ItemsSource的{​​{1}}属性绑定到我的ViewModel中的属性。然后,我创建DataGrid并使用ICollectionView项目来源创建默认视图,如下所示:

DataGrid

其中_displayItemsView = CollectionViewSource.GetDefaultView(_displayItems);_displayItemsList_displayItemsView

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

ICollectionView

这大部分时间都很好用,但如果用户当前正在编辑或在 _displayItemsView.Filter = delegate(object item) { DISPLAY_ITEM displayItem = (DISPLAY_ITEM)item; if ((displayItem.RETAIL_ITEM_DPCI.ToString().ToUpper().Contains(value.ToUpper())) . . . 中添加一行,则DataGrid会抛出未处理的异常。我该如何检测是否:

  1. 目前正在修改ICollectionView
  2. DataGrid未处于要过滤的状态?
  3. 任何指导都表示赞赏,我对这些想法持开放态度。谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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

  • CurrentEditItemCurrentAddItem将指向他们各自的 这些状态处于活动状态时的对象。

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

  • IsEditingItem会告诉您编辑交易是否正在进行中

  • IsInUse将告知当前是否有订阅者

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