2009-05-30 3 views
21

Ho un DataGrid WPF con alcuni dati. È possibile aggiungere righe attraverso una finestra separata. DataContext è lo stesso, un oggetto LINQ-to-SQL. Anche il binding è lo stesso, lego la proprietà "ItemsSource" a una tabella.Come aggiornare un DataGrid WPF?

Nell'altra finestra, quando l'utente fa clic su "Salva", creo una riga in modo programmatico e la aggiungo utilizzando "InsertOnSubmit". Successivamente utilizzo il metodo "SubmitChanges" di DataContext.

Il mio problema è che DataGrid non viene aggiornato. Se riavvio l'applicazione posso vedere la nuova riga, quindi è nel database, ma non ho trovato un modo per aggiornare il DataGrid.

Finora ho provato a utilizzare "UpdateTarget" su BindingExpression di DataGrid, ma non è stato di aiuto. Ho anche provato "dataGrid.Items.Refresh()" - stesso risultato. Come posso risolvere questo?

risposta

20

La ragione per cui non si sta aggiornando è che LINQ-to-SQL non implementa INotifyCollectionChanged, quindi WPF non ha modo di dire che ItemsSource è stato aggiornato. Il modo meno terrificante per risolvere questo problema, è quello di copiare i risultati LINQ-to-SQL in una ObservableCollection - quando si inserisce l'Insert, aggiungere anche alla raccolta osservabile. Quindi vedrai l'aggiornamento.

+0

La soluzione è ovviamente funzionante. Ho solo pensato che potevo farla franca con un semplice markup di binding XAML. – KovBal

+0

Se usiamo ObservableCollection come bridge tra linq e sql e il controllo, come possiamo utilizzare SubmitChanges() per postback del risultato nel database? – MemoryLeak

+3

@MemoryLeak - quindi ecco la parte difficile; non solo vuoi sapere quando la * collezione * cambia (ad esempio, cosa è INotifyCollectionChanged), vuoi anche sapere quando uno qualsiasi degli * articoli * cambia. Quindi è necessario iscriversi alla modifica della raccolta, quindi aggiungere/rimuovere, iscriversi a INotifyPropertyChanged di ciascun elemento. * Quindi * devi decidere cosa salvare in base alle notifiche che ricevi –

2

Il problema è che è necessario aggiornare il DataContext LINQ-to-SQL. DataContext non riconoscerà correttamente la nuova riga anche dopo le modifiche di invio. Devi disporre del DataContext che hai e crearne uno nuovo. Nella maggior parte dei casi, DataContext deve essere utilizzato per una breve operazione e non come un oggetto di lunga durata.

+0

La tua soluzione è molto simile a quella di Pwninstein. Sfortunatamente il risultato è lo stesso, in quanto l'evento DataContextChanged non aggiorna DataGrid. – KovBal

0

Oppure basta richiamare nuovamente il codice di ricerca (in genere il pulsante di ricerca)> l'ho risolto nel mio caso in questo modo.

1

Se si dispone di un caso in cui è necessario ricaricare una griglia in un'altra finestra, è sufficiente chiudere la finestra e richiamarla di nuovo.

56
+0

Grazie :) Ho provato a ricontrollare la stessa fonte ma non ha aggiornato i dati.Setting ItemsSource = null e quindi la sorgente corretta ha fatto un aggiornamento ma ha causato il licenziamento di SelectionChanged. Gli Items.Refresh() funzionavano perfettamente! – Gertjan

+0

Funziona perfettamente! –

+0

Funziona perfettamente. grazie :) –

4

Ho incontrato lo stesso problema e ha scoperto che il posto migliore per ObservableCollection è DataContext. Ha alcuni metodi parziali generati dal designer che possono essere utilizzati per aggiornare la raccolta. Questo codice funziona abbastanza bene:

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

Per qualche ragione Items.Refresh() non funziona per me. Cosa è stato fatto per rendere ereditata la mia collezione sottostante ObservableCollection e poi chiamare il suo metodo Add.

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

ContactUIObjects soli griglie sottostanti raccolta.