2012-05-11 10 views
1

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

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

このコードブロックのdoesntのは、例外をもたらしますが、私はあまりにもUIを更新文句を言わない...それは何もしないようだ:

アイブ氏は次のように異なる派遣でそれを試してみました。

誰でも手伝ってもらえますか?

答えて

1

LINQクエリが評価されると、データグリッドが更新されます。今はLINQ IEnumerableを指定していますが、評価していません。それがリフレッシュするグリッド全体の原因として、私はあなたのcvs.View.Refresh()コールは非常に高価であると言わなければならないが、

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

...あなたのためのLINQの評価を行う必要があります。あなたはここでより良いデザインを考慮する必要があります。

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

しかし、私の意見では、ここであなたのスレッドのコンテキストを認識していません。しかし、やはり私に知らせてください。

+0

あなたのヒントありがとうございますが、DatagridのItemsSourceをデータベースに直接設定すると、 'datagrid.ItemsSource = _db.Table;' その後、データグリッド** doesnt ** 'は自動的に更新されますデータベースのエントリが書かれています... :( – mj2k2

+0

DB更新のイベントを受け取ったときに 'Table.AcceptChanges()'を試しましたか?それもうまくいけない場合は、元のtipを '.ToList() '? –

+0

Didnt work too ... :( – mj2k2

関連する問題