防止 ICollectionView 更新 PropertyChanged 上的过滤器并从集合中删除

Prevent ICollectionView updating filter on PropertyChanged and removing from collection

我遇到了一个奇怪的问题,我有一个过滤的网格,当我修改网格上的值时,该行被删除,因为它不再符合过滤器的条件。

我正在使用 Entity Framework 加载本地数据。

mydbcontext.myobject.LoadAsync();

然后我将网格 ItemSource 绑定到 ICollectionView:

ICollectionView myitemslist = CollectionViewSource.GetDefaultView(mydbcontext.myobject.Local);

然后我使用(作为示例)

对数据集执行过滤
BusinessProfiles.Filter = f =>
{
    var a = f as MyObjectType;
    return a.propA == a.propB;
}

这非常有效,但是如果我随后使用网格修改对象以使该条件不再成立,则该对象将从集合中消失。

CollectionChanged 事件正在触发,但我不希望它触发。

我的理解是,为了以这种方式运行,我必须使用实现 ICollectionViewLiveShaping 的对象,例如 BindingListCollectionView 或 ListCollectionView

当我进行更改时,我不希望过滤器更新,直到我保存这些更改并将这些更改传播到数据库。

我认为最简单的解决方案是使用单独的集合来绑定视图。在最合适的时候使用 Linq 过滤数据。 我想你会发现:

ICollectionView myitemslist = CollectionViewSource.GetDefaultView(mydbcontext.myobject.Local);

不仅仅是一个 ICollectionView,它还是一个 ListCollectionView 或类似的东西。这将应用您的过滤器,因为设置了 observablecollection 中的基础项目。 鉴于您可能希望 observablecollection 的其他方面起作用,但您不希望在此阶段启动过滤,然后在代码中明确地执行它,您可以精确控制您想要发生的事情何时发生。