Observablecollection更改不会触发更新

时间:2013-02-01 12:54:32

标签: c# wpf observablecollection

我想我知道问题是什么,但我对它的解决方案一无所知。

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

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

                dgRoutedData.ItemsSource = q;

我想我将itemssource设置为上述LINQ查询的结果会破坏来自observable集合的整个自动通知,因此如何让datagrids显示过滤后的视图,这些视图将在项目具有&#34时实际更新;路线"价值变了吗?

2 个答案:

答案 0 :(得分:1)

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

e.g。

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

(这样做的缺点是你需要对新的observable进行操作,因为之前的observable不会为新的observable引发项目更改事件)

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

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

e.g。

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

或者不要重新发明轮子并使用PagedCollectionView作为建议包含上述功能的人员(带有过滤谓词和其他功能的私人支持字段)

答案 1 :(得分:0)

重新加载支持obvservable集合中的项目(collection.Clear(); collection.AddAll(q))而不是更改网格的ItemsSource引用