0

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

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

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

                dgRoutedData.ItemsSource = q;

我想我将 itemssource 设置为上述 LINQ 查询的结果会破坏来自 observable 集合的整个自动通知,那么如何让数据网格显示过滤视图,当项目的“Route”值发生更改时,这些视图将实际更新?

4

2 回答 2

1

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

例如

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

(这有一个缺点,您需要对新的 observable 进行操作,因为以前的 observable 不会为新的 observable 引发项目更改事件)

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

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

例如

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

或者不要重新发明轮子并PagedCollectionView像有人建议的那样使用包装上述功能(一个带有过滤谓词和其他功能的私有支持字段)

于 2013-02-01T13:02:55.557 回答
0

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

于 2013-02-01T13:00:12.337 回答