0

我将 a 的属性绑定ItemsSourceDataGrid我的 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()))
                                      .
                                      .
                                      .

这在大多数情况下都很好用,但是如果用户当前正在编辑或添加一行,DataGridICollectionView. 我应该如何去检测是否:

  1. 目前DataGrid正在修改或
  2. ICollectionView是不是处于被过滤的状态?

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

4

1 回答 1

5

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

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

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

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

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

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

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

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

于 2014-05-07T12:44:31.483 回答