views:

4827

answers:

3

I have a WPF DataGrid with some data. You can add rows through a separate window. The DataContext is the same, a LINQ-to-SQL object. Binding is also the same, I bind the "ItemsSource" property to a table.

In the other window, when the user clicks on "Save", I create a row programatically and add it using "InsertOnSubmit". After that I use the DataContext's "SubmitChanges" method.

My problem is that the DataGrid isn't updated. If I restart the application I can see the new row, so it's in the database, but I couldn't find a way to refresh the DataGrid.

So far I've tried to use "UpdateTarget" on the BindingExpression of the DataGrid, but it didn't help. I've also tried "dataGrid.Items.Refresh()" — same result. How can I fix this?

+5  A: 

The reason it's not updating is that LINQ-to-SQL doesn't implement INotifyCollectionChanged, so WPF has no way to tell that the ItemsSource has been updated. The least terrifying way to fix this, is to copy your LINQ-to-SQL results to an ObservableCollection - when you do the Insert, also add to the observable collection. Then you'll see the update.

Paul Betts
Your solution is obviously working. I just thought I could get away with simple XAML binding markup.
KovBal
If we use a ObservableCollection to be a bridge between linq to sql and the control, then how can we use SubmitChanges() to post back the result back to database ?
MemoryLeak
@MemoryLeak - so here's the tricky bit; not only do you want to know when the *collection* changes (i.e. what INotifyCollectionChanged), you also want to know when any of the *items* change. So you need to subscribe to the collection change, then on add/remove, subscribe to each item's INotifyPropertyChanged. *Then* you have to decide what to save based on which notifications you're getting
Paul Betts
+1  A: 

The problem is that you need to refresh your LINQ-to-SQL DataContext. The DataContext's won't properly recognize the new row even after a submit changes. You need to dispose the DataContext you have and create a new one. In most cases DataContext should be used for one short operation and not as a long standing object.

Stephan
Your solution is very similar to Pwninstein's. Unfortunately the result is the same, as the DataContextChanged event doesn't make the DataGrid refresh.
KovBal
A: 

Or just invoke the search code again (usually the search button)> I have solved it in my case like this.

Branimir