Laden...

[erledigt] GridView aktuallisiert sich nicht

Erstellt von dsdsfga vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.458 Views
D
dsdsfga Themenstarter:in
53 Beiträge seit 2011
vor 12 Jahren
[erledigt] GridView aktuallisiert sich nicht

Ich habe ein etwas aufwändigeres GridView das mir eine Liste von Objekten (Personen) anzeigt.
Jedes Personen Objekt hat ein Postcode-Objekt das die Postleitzahl und den Ort beinhaltet.

Egal welchen Text ich ändere via weiteres binding aktuallisiert sich automatisch die GUI. Nur wenn ich jetzt das Postcode-Objekt austausche ändert sich an der GUI nichts! Vermutlich weil da keine Eventlistener sind die auf das Event achten. Wie löse ich das Problem?

Mein Grid:

<ListView ItemsSource="{Binding Path=PersonCollection}" IsSynchronizedWithCurrentItem="true" SelectionMode="Single">
  <ListView.View>
    <GridView>
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name, Mode=TwoWay}"/>
      <GridViewColumn Header="PLZ" DisplayMemberBinding="{Binding Postcode.PLZ, Mode=TwoWay, StringFormat=00000}"/>
      <GridViewColumn Header="Stadt" DisplayMemberBinding="{Binding Postcode.City, Mode=TwoWay}"/>
    </GridView>
  </ListView.View>
</ListView>

Die Änderung erfolgt über eine AutoCompleteBox wenn der XAML-Code von Interesse ist melden.

821 Beiträge seit 2009
vor 12 Jahren

Du must INotifyPropertyChange auf die Postcode - Property auslösen. Hierzu muss die Klasse die das Postcode - Property beinhaltet INotifyPropertyChanged implementieren.

D
dsdsfga Themenstarter:in
53 Beiträge seit 2011
vor 12 Jahren

Die Postcode-Klasse implementiert bereits das INotifyPropertyChanged Interface. Selbst wenn ich das Event OnPropertyChanged manuel aufrufe passiert nichts.

Weitere Tipps? Ich stehe gerade damit ziemlich im Dunklen...

643 Beiträge seit 2006
vor 12 Jahren

INotifyPropertyChanged wird nur gefeuert, wenn sich eine Eigenschaft
innerhalb deines Personen Objekts ändert.

Das passiert aber nicht, wenn du ein neues Objekt einer Collection hinzufügst.
Dafür gibt es INotifyCollectionChanged.

Benutze eine ObservableCollection<Personen> (die implementiert INotifyCollectionChanged) und füge oder ersetzte dort deine Personen Objekte.

821 Beiträge seit 2009
vor 12 Jahren

Moment! Er hat geschrieben "Nur wenn ich jetzt das Postcode-Objekt austausche ändert sich an der GUI nichts!"

So wie ich das sehe ist das PostCode-Object ein Objekt der Personen-Klasse. Damit würde sich die Personen Collection nicht ändern, sondern nur ein Objekt der Collection.

Wenn sich das PostCode-Objekt ändert, muss nicht das PostCode Objekt INotifyPropertyChanged Implementieren, sondern die Personen-Klasse und bei der Änderung muss OnNotifyPropertyChanged("PostCode") aufgerufen werden.

643 Beiträge seit 2006
vor 12 Jahren

hab "Postcode" übersehen. sollte mal gründlicher lesen 😃

D
dsdsfga Themenstarter:in
53 Beiträge seit 2011
vor 12 Jahren

Ihr bringt mich da auf eine Idee:
Ich denke es ist der Richtige weg das Interface INotifyCollectionChanged zu implementieren. Wenn ich aber per NotifyCollectionChanged bekannt gebe das sich nur ein Element geändert hat sollte das die GUI sich korrekt verhalten lassen.

Ich teste es mal aus und melde mich später nochmal.

821 Beiträge seit 2009
vor 12 Jahren

Bitte beachte, dass INotifyCollectionChanged nur dazu dient, bekannt zu machen, dass sich Auflistungen geändert haben. Die Äderung einer Auflistung beschränkt sich damit auf das Hinzukommen oder Wegnehmen von Elementen (wird auch aus den entsprechenden Event-Argumenten klar).
Du kannst natürlich das entsprechende Element aus der Auflistung entfernen und wieder hinzufügen. Das wäre aber ein sehr unschöner Workarround dafür, der GUI mitzuteilen, das sich ein Property geändert hat.

Warum probierst du es nicht wie vorgeschlagen?

public class PersonenViewModel : INotifyPropertyChanged
{
   private PostCodeType postCode;
   public PostCodeType PostCode
   {
      get { return this.postCode; }
      set
      {
         if(this.postCode != value}
         {
            this.postCode = value;
            OnNotifyProeprtyChanged("PostCode");
         }
      }

...

}
D
dsdsfga Themenstarter:in
53 Beiträge seit 2011
vor 12 Jahren

Ha geht doch.
Der Tipp von dir Christoph war prima!

Ich habe einfach geguckt ob sich die PostcodeID ändert wenn das passiert schicke ich ein OnNotifyProeprtyChanged("Postcode") und alles klappt so wie es soll.

partial void OnPostcodeIDChanged() {
    OnPropertyChanged("Postcode");
}

Problem ist für mich gelöst.