none
UpdateSourceTrigger=Explicit funktioniert im WPF DataGrid nicht. Woran könnte das liegen? RRS feed

  • Frage

  • Hallo zusammen,

    ich stelle in einem kleinen Programm Personen in einem DataGrid in einem Fenster dar. Hierzu habe ich eine Bindung zwischen DataGrid und einer Liste mit diesen Personen erstellt. Dabei soll es so sein, dass man den Namen etc. im Grid ändern kann, aber anschließend die Operation durch einen Abbrechen Button noch abbrechen kann, ebenso wie man sie durch einen Speichern Button bestätigen kann. Ich habe daher UpdateSourceTrigger überall, wo es ging, auf Explicit gesetzt. Allerdings ist es immer noch so, dass ich, wenn ich das Fenster öffne, etwas ändere und es anschließend schließe, die Daten gespeichert werden (Speichern- und Abbrechen-Button hab ich noch gar nicht erstellt, da es eh bis dato keinen Sinn macht und eh nicht funktionieren würde). Ich rufe allerdings nirgends die Funktion UpdateSource() auf, so dass das eigentlich keinen Sinn macht. Im Folgenden mein XAML-Code:

    <Window Name="myWindow" x:Class="ORace.MyDataGrid" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="MyDataGrid" Height="250" Width="500" Closing="myWindow_Closing">
     <DockPanel>
     <DataGrid Name="MyGrid" AutoGenerateColumns="False" ItemsSource="{Binding Path=Persons, Mode=TwoWay, UpdateSourceTrigger=Explicit}">
     <DataGrid.Columns>
     <DataGridTextColumn Width="*" MinWidth="70" Header="Vorname" Binding="{Binding Mode=TwoWay, UpdateSourceTrigger=Explicit, Path=FirstName}">
    </DataGridTextColumn>
     <DataGridTextColumn Width="*" MinWidth="70" Header="Nachname" Binding="{Binding Mode=TwoWay, UpdateSourceTrigger=Explicit, Path=LastName}">
    </DataGridTextColumn>
     </DataGrid.Columns>
     </DataGrid>
     </DockPanel>
    </Window>

     

     

    und der Code in der Code-Behind-Datei (C#)

    public MyDataGrid(List<Person> persons) {
     InitializeComponent();
     Persons = persons;
     MyGrid.DataContext = this;
     this.Show();
     }

     

     

    Der Konstruktor MyDataGrid(persons) wird jeweils beim Öffnen des Fensters aufgerufen. Habe im Internet schon nach diesem Problem gesucht, aber es nur im Zusammenhang mit dem Master-Detail Szenario gefunden, mit dem ich nichts anfangen konnte.

    Als zusätzliches Problem tritt auf, dass ich in dem Fall, in dem ich die Zellen editiere und nicht mehr in eine andere Zeile gehe, sondern das Fenster einfach schließe, und anschließend wieder den Konstruktor aufrufe, eine InvalidOperationException bekomme. Mir ist auch überhaupt nicht klar, wie diese Exception zustande kommt...

     

    "DeferRefresh" ist während einer AddNew- oder EditItem-Transaktion nicht zulässig.

     

    Ich wäre sehr dankbar, wenn mir jemand bei dem Problem helfen könnte, ich suche jetzt schon seit einiger Zeit nach einer Lösung. Ich könnte natürlich mit irgendwelchen Klonen versuchen, das Problem in den Griff zu kriegen, aber eigentlich sollte es WPF ja von Haus aus können...

    Besten Dank und viele Grüße!

    • Bearbeitet derheinzi Montag, 13. Dezember 2010 17:08
    Samstag, 16. Oktober 2010 19:10

Alle Antworten

  • Hi,

    kurzes Update: Ich habe jetzt das Gleiche nochmal über Template Columns definiert und dann funktioniert es, dass es nicht upgedatet wird, allerdings schmeckt mir das nicht so gut, weil ich dann ne Textbox in die Tabelle packen muss und das sieht vom Design insgesamt nicht so rund aus. Außerdem müsste ich dann auch einzeln die Elemente updaten, womit ich bisher durch die sehr verschachtelte Struktur von Template Columns ein bisschen Probleme habe.

    Als weitere Möglichkeit könnte ich noch die Elemente der Liste einzeln klonen und die beiden Listen bei Bestätigung mit "Speichern" synchronisieren, was allerdings auch nicht optimal ist, da speicher- und rechenintensiver.

    Die oben genannte Exception konnte ich bisher nicht beheben, das würde sich aber vermutlich notfalls regeln lassen, indem man beim Speichern/Schließen des Fensters ein FocusLost Event auf der entsprechenden Zeile auslöst.

    Würde mich sehr freuen, wenn mir vielleicht doch irgendjemand noch helfen könnte.

    Danke!
    Sonntag, 17. Oktober 2010 19:07
  • Hi,

     

    ich hatte den selben Fehler. Bei mir war es an einem DataGrid. Ich hatte im DataGrid das editieren durch den Benutzer erlaubt. Wenn man dem DataGrid die Datenquelle unterm Hintern wegzieht und durch eine andere ersetzt und das DataGrid gerade im Editiermodus ist, dann wird diese Meldung geworfen.

     

    Lösung:

    Vor dem wegziehen der Datenquelle mit der Methode "CommitEdit()" oder "CancelEdit()" das Datagrid zum speichern/canceln der Änderungen an der alten Datenquelle zwingen. Tauscht man danach die Datenquelle aus, gibt es keine Probleme.

    • Als Antwort vorgeschlagen alexfiftyfour Dienstag, 3. Mai 2011 11:19
    Dienstag, 3. Mai 2011 11:19