none
DataContext aktualisieren RRS feed

  • Frage

  • Hallo!

    Ich setze den DataContext einer ListBox im Loaded Event eines Windows:

    List<string> li = new List<string>();
    
    private void wndTest_Loaded(object sender, RoutedEventArgs e)
    {
        li.Add("1. Eintrag");           // Liste initalisieren
        lib.DataContext = li;           // Daten der ListBox zur Verfügung stellen
    }
    


    Die ListBox zeigt mir korrekt einen Eintrag an.

    Nun möchte ich zur Laufzeit einen weiteren Eintrag hinzufügen, indem ich die Liste erweitere:

    private void btn_Click(object sender, RoutedEventArgs e)
    {
        li.Add(tbo.Text);               // Eintrag hinzufügen
        lib.DataContext = li;           // Aktualisierte Daten zur Verfügung stellen!
    }
    

    Aber obwohl ich den DataContext explizit setze, wird die Anzeige nicht aktualisiert (die Liste schon). Kann ich denn wirklich nur eine OC verwenden?

    Die GUI:

    <Grid>
        <StackPanel Orientation="Horizontal">
            <TextBox Name="tbo" Text="2. Eintrag" VerticalAlignment="Top" />
            <Button Name="btn"  Click="btn_Click" Content="+" VerticalAlignment="Top"/>
        </StackPanel>
        <ListBox Name="lib" ItemsSource="{Binding}" VerticalAlignment="Bottom" />
    </Grid>
    


    Fred.

    Montag, 7. November 2016 15:18

Antworten

  • Hallo Fred,

    wenn sich ein Eigenschaftswert ändert, wird das PropertyChanged-Event ausgelöst. Implementiert deine Datenquelle das Interface INotifyPropertyChanged, wird die View für das Event registriert, wenn du an diese Datenquelle bindest. Ändert sich ein Wert, wird das Event ausgelöst und die View aktualisiert.

    Für dich wäre es das einfachste, anstatt List<string> eine ObservableCollection<string> zu verwenden, welche die entsprechenden Ereignisse schon implementiert.

    Beste Grüße


    • Bearbeitet Flogex Montag, 7. November 2016 16:38
    • Als Antwort markiert perlfred Dienstag, 8. November 2016 13:30
    Montag, 7. November 2016 16:36
  • Hi Fred,
    die Zuweisung des gleichen Verweises zum DataContext bewirkt kein Refresh der Anzeige.

    Die Liste sollte die Aktualisierung seines Inhaltes melden (per INotifyCollectionChanged,
    INotifyPropertyChange). Dazu eignet sich am besten die ObservableCollection. Eine wiederholte Zuweisung ist dann nicht erforderlich.

    Wenn auch die Änderungen der Werte der Eigenschaften der Datenobjekte in der Liste zu einer Aktualisierung der Oberfläche führen sollen, dann muss in der Datenklasse das INotifyPropertyChanged-Interface implementiert sein und es müssen diese Eigenschaften (in der Daten-Klasse) das PropertyChanged Ereignis auslösen.


    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort vorgeschlagen Elmar Boye Montag, 7. November 2016 21:36
    • Als Antwort markiert perlfred Dienstag, 8. November 2016 10:43
    Montag, 7. November 2016 17:32

Alle Antworten

  • Hallo Fred,

    wenn sich ein Eigenschaftswert ändert, wird das PropertyChanged-Event ausgelöst. Implementiert deine Datenquelle das Interface INotifyPropertyChanged, wird die View für das Event registriert, wenn du an diese Datenquelle bindest. Ändert sich ein Wert, wird das Event ausgelöst und die View aktualisiert.

    Für dich wäre es das einfachste, anstatt List<string> eine ObservableCollection<string> zu verwenden, welche die entsprechenden Ereignisse schon implementiert.

    Beste Grüße


    • Bearbeitet Flogex Montag, 7. November 2016 16:38
    • Als Antwort markiert perlfred Dienstag, 8. November 2016 13:30
    Montag, 7. November 2016 16:36
  • Hi Fred,
    die Zuweisung des gleichen Verweises zum DataContext bewirkt kein Refresh der Anzeige.

    Die Liste sollte die Aktualisierung seines Inhaltes melden (per INotifyCollectionChanged,
    INotifyPropertyChange). Dazu eignet sich am besten die ObservableCollection. Eine wiederholte Zuweisung ist dann nicht erforderlich.

    Wenn auch die Änderungen der Werte der Eigenschaften der Datenobjekte in der Liste zu einer Aktualisierung der Oberfläche führen sollen, dann muss in der Datenklasse das INotifyPropertyChanged-Interface implementiert sein und es müssen diese Eigenschaften (in der Daten-Klasse) das PropertyChanged Ereignis auslösen.


    --
    Viele Grüsse
    Peter Fleischer (MVP Reconnect, Partner)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort vorgeschlagen Elmar Boye Montag, 7. November 2016 21:36
    • Als Antwort markiert perlfred Dienstag, 8. November 2016 10:43
    Montag, 7. November 2016 17:32
  • Hallo Peter!

    Danke für die klaren Worte :-)!

    Meine Frage zielte darauf ab, ob man nicht doch eine Generic List<string> verwenden kann und dem WPF-Objekt separat "sagt", jetzt hat sich meine Liste verändert, zeichne neu.

    (Hintergrund: Ich hatte eine Methode erstellt, die (nur!) List<string>-Listen in eine XML-Datei schreibt/liest.)

    Mit OC funktioniert es natürlich, aber das wollte ich eigentlich umgehen.

    Die Zuweisung des gleichen Verweises zum DataContext bewirkt kein Refresh der Anzeige. :-(

    Danke für deine Hilfe!

    Dienstag, 8. November 2016 11:04
  • Hallo Fred,

    Als Anmerkung fürs "Umgehen":

    Wenn Du für das Lesen/Schreiben für Xml "nur" eine List<T> brauchen kannst, so könnte eine bessere Lösung sein, als Parameter eine IList<T> (oder gar IEnumerable<T>) zu verwenden. Das unterstützen sowohl List<T>, OberservableCollection<T> (oder auch ein Array).

    Damit wären die Xml-Funktionen flexibel, was ihre Vorgabe angeht. Eine ObservableCollection<T> kann wiederum aus einer List<T> erstellt werden.

    Gruß Elmar

    Dienstag, 8. November 2016 11:44
  • Hallo Elmar!

    So ähnlich habe ich es dann auch gelöst. Die XML-Funktion hat jetzt eine Überladung, die OC benutzt.

    Werde deinen Hinweis aber noch einmal aufgreifen und es mit IEnumerable<T> versuchen.

    Danke!

    Dienstag, 8. November 2016 13:27
  • Hallo Flogex!

    Habe es dann auch so gemacht. Wollte es aber eigentlich nicht so lösen :-), da ich Einiges umstellen musste.

    Trotzdem auch dir ein Dankeschön für deine Mühe!

    Fred.

    Dienstag, 8. November 2016 13:30