1

ここに新しい問題があります。ContentGridであるMainWindowがあり、これにはFrameがあります。これで、この「コンテンツ領域」に表示できるさまざまなページを作成しました。これらのページの1つに、SourceがデータベースであるCollectionViewSourceにバインドされたDatagridがあります(EntityFrameworkを介して)。これで、このデータベーステーブルの変更が発生した場合(ServiceBrokerとSQLDependencyを介して解決され、起動は正常に機能します)、データグリッドを更新する必要があります。 問題: 「Dependency_OnChange」-イベントがMainWindow-Threadで機能しています。ページのCollectionViewSourceにアクセスして更新しようとすると(cvs.View.Refresh)、このCVSを所有する別のスレッドが原因でこれが不可能であるという例外が発生します。

私は次のような別のディスパッチでそれを試しました:

Application.Current.Dispatcher.Invoke((Action)(()=>
                {
                    cvs.Source = _db.Table.OrderByDescending(nr => nr.Date).Take(200);
                    cvs.View.Refresh();
                }));

このコードブロックは例外を発生させませんが、UIも更新しません...何もしないようです。

誰か助けてもらえますか?

4

1 に答える 1

1

LINQ クエリが評価されると、データ グリッドが更新されます。現在、LINQ IEnumerable を指定しているだけですが、評価していません。

    cvs.Source = _db.Table.OrderByDescending(nr => nr.Date).Take(200).ToList(); 

あなたのためにLINQの評価を行うべきです...

cvs.View.Refresh()グリッド全体が更新されるため、呼び出しは非常に高価であると言わざるを得ません。ここでより良い設計を検討する必要があるかもしれません。

dataGrid.ItemsSource = _db.Table.DefaultViewを項目ソースとしてデータグリッドに直接設定しないでください。あなたのテーブルが更新された(そして実行され_db.Table.AcceptChanges();た)場合、ビューは自動的にグリッドへの変更を通知し、グリッドはおそらくそれ自体をより速く更新するでしょう!

しかし、ここでスレッドのコンテキストを認識していないため、それは私の意見です。それでも試してみて、私に知らせてください。

于 2012-05-11T11:41:21.603 に答える