いくつかのデータを含むWPF DataGridがあります。別のウィンドウから行を追加できます。 DataContextは同じ、LINQ-to-SQLオブジェクトです。バインドも同じです。「ItemsSource」プロパティをテーブルにバインドします。
他のウィンドウで、ユーザーが「保存」をクリックすると、プログラムで行を作成し、「InsertOnSubmit」を使用して行を追加します。その後、DataContextの「SubmitChanges」メソッドを使用します。
私の問題は、DataGridが更新されないことです。アプリケーションを再起動すると、新しい行がデータベースに表示されますが、DataGridを更新する方法が見つかりませんでした。
これまで、DataGridのBindingExpressionで「UpdateTarget」を使用しようとしましたが、役に立ちませんでした。 「dataGrid.Items.Refresh()」も試しました—同じ結果です。どうすれば修正できますか?
更新されない理由は、LINQ-to-SQLがINotifyCollectionChangedを実装していないため、WPFにItemsSourceが更新されたことを通知する方法がないためです。これを修正する最も恐ろしい方法は、LINQ-to-SQLの結果をObservableCollectionにコピーすることです。Insertを実行すると、observableコレクションにも追加されます。その後、更新が表示されます。
ここからdatagrid.Items.Refresh()を試してください http://programmer.wrighton.org/2009/01/wpf-datagrid-items-refresh.html
同じ問題にぶつかり、ObservableCollectionの最適な場所はDataContextであることがわかりました。コレクションを更新するために使用できるデザイナーによって生成されたいくつかの部分的なメソッドがあります。このコードはかなりうまく機能します:
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);
}
}
問題は、LINQ-to-SQL DataContextを更新する必要があることです。送信が変更された後でも、DataContextは新しい行を正しく認識しません。所有しているDataContextを破棄し、新しいDataContextを作成する必要があります。ほとんどの場合、DataContextは1つの短い操作に使用し、長期にわたるオブジェクトとしては使用しないでください。
別のウィンドウでグリッドを再ロードする必要がある場合は、単にそのウィンドウを閉じて再度呼び出すことができます。
または、単に検索コード(通常は検索ボタン)を再度呼び出します>私の場合、このように解決しました。
何らかの理由でItems.Refresh()
が機能していません。動作したのは、基になるコレクションにObservableCollection
を継承させてから、そのAdd
メソッドを呼び出すことでした。
((ContactUIObjects)dgrdContacts.ItemsSource).Add(new ContactUIObject(o));
ContactUIObjects
は、コレクションの基になるグリッドです。