【问题标题】:How to tell if an ICollectionView is currently filterable?如何判断 ICollectionView 当前是否可过滤?
【发布时间】:2014-05-06 18:32:45
【问题描述】:

我将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 不是处于过滤状态?

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

【问题讨论】:

  • 这个异常会有一个 message 属性。邮件内容是什么?
  • @GarryVass 消息是“在 AddNew 或 EditItem 事务期间不允许‘过滤’。”

标签: c# wpf datagrid filter icollectionview


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2011-03-09
    • 2011-09-13
    • 2010-10-18
    • 2010-09-12
    相关资源
    最近更新 更多