2009-05-30 25 views
21

私はいくつかのデータを持つWPF DataGridを持っています。別のウィンドウで行を追加することができます。 DataContextはLINQ-to-SQLオブジェクトと同じです。バインディングも同じです。 "ItemsSource"プロパティをテーブルにバインドします。WPF DataGridを更新するには?

ユーザーが「保存」をクリックすると、プログラムで行を作成し、「InsertOnSubmit」を使用して追加します。その後、私はDataContextの "SubmitChanges"メソッドを使用します。

私の問題は、DataGridが更新されないということです。アプリケーションを再起動すると新しい行が表示されるので、データベースにありますが、DataGridを更新する方法が見つかりませんでした。

これまでのところ、私はDataGridのBindingExpressionに "UpdateTarget"を使用しようとしましたが、それは役に立ちませんでした。私はまた、 "dataGrid.Items.Refresh()"を試みました - 同じ結果。これをどうすれば解決できますか?

答えて

20

LINQ-to-SQLはINotifyCollectionChangedを実装していないため、WPFはIt​​emsSourceが更新されたことを通知する方法がありません。これを修正する最も恐ろしい方法は、LINQ-to-SQLの結果をObservableCollectionにコピーすることです。挿入を行うときに、observableコレクションにも追加します。その後、更新が表示されます。

+0

あなたのソリューションは明らかに機能しています。私は単なるXAMLバインディングマークアップで逃げることができたと思っています。 – KovBal

+0

ObservableCollectionを使用してlinqとsqlとの間のブリッジとコントロールを使用する場合、SubmitChanges()を使用して結果をデータベースにポストバックする方法を教えてください。 – MemoryLeak

+3

@ MemoryLeak - だからこそトリッキーなビットです。 *コレクション*が変更されたとき(つまりINotifyCollectionChangedが何であるか)知りたいだけでなく、*アイテム*が変更されたときも知りたいと思っています。したがって、コレクションの変更を購読してから、追加/削除し、各アイテムのINotifyPropertyChangedをサブスクライブする必要があります。 *あなた*あなたはあなたが得ている通知に基づいて保存するものを決める必要があります –

2

問題は、LINQ-to-SQL DataContextを更新する必要があることです。 DataContextは、送信が変更された後でも、新しい行を正しく認識しません。あなたはあなたが持っているDataContextを処分し、新しいものを作成する必要があります。ほとんどの場合、DataContextは1つの短い操作に使用する必要があり、長期間使用するオブジェクトとしては使用しないでください。

+0

あなたのソリューションはPwninstein'sに非常によく似ています。残念ながら、結果は同じです.DataContextChangedイベントはDataGridを更新しないためです。 – KovBal

0

また、検索コードをもう一度呼び出す(通常は検索ボタン)>私はこのようなケースで解決しました。

1

別のウィンドウでグリッドをリロードする必要がある場合は、そのウィンドウを閉じてもう一度呼び出すことができます。

56

は、私は同じ問題に遭遇したとのObservableCollectionのための最高の場所でのDataContextであることが判明し、ここでhttp://programmer.wrighton.org/2009/01/wpf-datagrid-items-refresh.html

+0

ありがとうございました:)同じソースを再バインドしようとしましたが、データを更新しませんでした。ItemsSource = nullを設定し、正しいソースが更新を行いましたが、SelectionChangedが発生しました。 Items.Refresh()は完璧に機能しました! – Gertjan

+0

これは完璧に動作します! –

+0

完全に動作します。ありがとう:) –

4

からdatagrid.Items.Refreshを()してみてください。デザイナーがコレクションを更新するために使用できるいくつかの部分的なメソッドがあります。このコードはかなりうまく機能:

partial class DataClassesDataContext 
{ 
    private ObservableCollection<Task> taskCollection; 
    public ReadOnlyObservableCollection<Task> TaskView { get; private set; } 

    partial void OnCreated() 
    { 
     taskCollection = new ObservableCollection<Task>(Tasks); 
     TaskView = new ReadOnlyObservableCollection<Task>(taskCollection); 
    } 

    partial void InsertTask(Task instance) 
    { 
     taskCollection.Add(instance); 
     this.ExecuteDynamicInsert(instance); 
    } 

    partial void DeleteTask(Task instance) 
    { 
     taskCollection.Remove(instance); 
     this.ExecuteDynamicDelete(instance); 
    } 
} 
0

Items.Refresh()が私のために働いていないいくつかの理由。 私の基になるコレクションをObservableCollectionに継承させてから、そのAddメソッドを呼び出すことができました。

((ContactUIObjects)dgrdContacts.ItemsSource).Add(new ContactUIObject(o)); 

ContactUIObjectsは、コレクションの基礎となるグリッドです。

関連する問題