wake-up-neo.com

Wie aktualisiere ich ein WPF DataGrid?

Ich habe ein WPF-DataGrid mit einigen Daten. Sie können Zeilen durch ein separates Fenster hinzufügen. Der DataContext ist dasselbe, ein LINQ-to-SQL-Objekt. Bindung ist auch die gleiche, ich binde die "ItemsSource" -Eigenschaft an eine Tabelle.

Wenn der Benutzer im anderen Fenster auf "Speichern" klickt, erstelle ich eine Zeile programmatisch und füge sie mit "InsertOnSubmit" hinzu. Danach verwende ich die "SubmitChanges" -Methode von DataContext.

Mein Problem ist, dass das DataGrid nicht aktualisiert wird. Wenn ich die Anwendung neu starte, kann ich die neue Zeile sehen. Sie befindet sich also in der Datenbank. Ich konnte jedoch keine Möglichkeit finden, das DataGrid zu aktualisieren.

Bisher habe ich versucht, "UpdateTarget" für die BindingExpression des DataGrid zu verwenden, aber es hat nicht geholfen. Ich habe auch "dataGrid.Items.Refresh ()" versucht - das gleiche Ergebnis. Wie kann ich das beheben?

24
KovBal

Der Grund für die Aktualisierung ist nicht, dass LINQ-to-SQL INotifyCollectionChanged nicht implementiert. Daher kann WPF nicht feststellen, dass die ItemsSource aktualisiert wurde. Der einfachste Weg, dies zu beheben, besteht darin, Ihre LINQ-to-SQL-Ergebnisse in eine ObservableCollection zu kopieren. Wenn Sie die Einfügung ausführen, fügen Sie sie auch zur beobachtbaren Auflistung hinzu. Dann sehen Sie das Update.

20
Paul Betts
63
nullpointer

Ich stieß auf das gleiche Problem und fand DataContext als beste Stelle für ObservableCollection. Es gibt einige vom Designer erzeugte Teilmethoden, mit denen die Sammlung aktualisiert werden kann. Dieser Code funktioniert ziemlich gut:

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);
    }
}
4
Dark Daskin

Das Problem ist, dass Sie Ihren LINQ-to-SQL-DataContext aktualisieren müssen. Die DataContext's erkennen die neue Zeile auch nach einer Änderung nicht richtig. Sie müssen über den vorhandenen DataContext verfügen und einen neuen erstellen. In den meisten Fällen sollte DataContext für eine kurze Operation und nicht als langjähriges Objekt verwendet werden.

2
Stephan

Wenn Sie einen Fall haben, in dem Sie ein Gitter in einem anderen Fenster neu laden müssen, können Sie dieses Fenster einfach schließen und erneut aufrufen.

1
user504737

Oder rufen Sie einfach den Suchcode erneut auf (in der Regel die Suchschaltfläche).

0
Branimir

Aus irgendeinem Grund funktioniert Items.Refresh() nicht für mich. Was funktionierte, war, meine zugrunde liegende Sammlung ObservableCollection zu erben und dann ihre Add-Methode aufzurufen.

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

ContactUIObjects ist nur die der Sammlung zugrunde liegende Tabelle.

0
Orson