可观察集合更改不会触发更新

本文关键字:更新 观察 集合 | 更新日期: 2023-09-27 17:56:54

我想我知道问题是什么,但我不知道它的解决方案。

有一个可观察的集合,我将其填充在 WPF 数据网格中。然后,我实现了将DataGrid中的行拖放到子网格。如果将一行拖动到另一个网格,我会更改ObservableCollection中的值,然后显示基础数据如下所示:

                var q = from standard in DispatchResult
                        where DispatchResult.Route == RouteName
                        select standard;
                dgRoutedData.ItemsSource = q;

我想我将 itemssource 设置为上述 LINQ 查询的结果会破坏可观察集合中的整个自动通知,那么我如何让数据网格显示过滤的视图,这些视图将在项目更改其"路由"值时实际更新?

可观察集合更改不会触发更新

您需要通知更改已发生 - 您可以随时尝试将 linq 查询的结果包装在新ObservableCollection

例如

var col = new ObservableCollection<DispatchResult>();
col.AddRange(q);
dgRoutedData.ItemsSource = col;

(这样做的缺点是您需要对新的可观察量进行操作,因为以前的可观察量不会引发新可观察量的项目更改事件)

或者只是清除/并重新添加到现有集合。

我假设您已经避免了这种情况,因为原始集合包含您希望在删除过滤器后"重新"过滤的项目。在这种情况下,您可能希望保留一个私有支持字段来保存实际数据,并将ObservableCollection<T>用作该支持字段的筛选窗口。

例如

_myList = new List<MyObject>(); // Populate it etc
SomeObservable.Clear(); 
SomeObservable.AddRange(from item in _myList where item.ID == 1 select item);

或者不要重新发明轮子并按照某人的建议使用PagedCollectionView来包装上述功能(带有过滤器谓词和其他内置功能的私有支持字段)

重新加载支持可观察集合(集合。清除();收集。AddAll(q)) 而不是更改网格的 ItemsSource 引用