0

問題が何であるかはわかっていると思いますが、その解決策についての手がかりはありません。

WPF DataGrid に入力する監視可能なコレクションがあります。DataGrid次に、子グリッドの行にドラッグ アンド ドロップを実装しました。行が別のグリッドにドラッグされた場合、値を変更してObservableCollection、次のように基になるデータを表示します。

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

                dgRoutedData.ItemsSource = q;

上記の LINQ クエリの結果に itemssource を設定すると、監視可能なコレクションからの自動通知全体が中断されると思います。そのため、アイテムの「ルート」値が変更されたときに実際に更新されるフィルター処理されたビューをデータグリッドに表示するにはどうすればよいですか?

4

2 に答える 2

1

変更が発生したことを通知する必要があります-いつでも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、上記の機能をラップする誰かが提案したように使用します(フィルター述語と他の機能が組み込まれたプライベートバッキングフィールド)

于 2013-02-01T13:02:55.557 に答える
0

グリッドの ItemsSource 参照を変更する代わりに、バッキング監視可能なコレクション (collection.Clear(); collection.AddAll(q)) でアイテムをリロードします

于 2013-02-01T13:00:12.337 に答える