INotifyPropertyChange ~ PropertyChanged nicht feuern, wenn die-Eigenschaft ist eine Sammlung und ein neues Element zur Sammlung Hinzugefügt
Habe ich eine Klasse, die INotifyPropertyChanged-Schnittstelle implementiert. Einige der Eigenschaften der Klasse sind vom Typ Liste. Zum Beispiel:
public List<string> Answers
{
get { return _answers; }
set
{
_answers = value;
onPropertyChanged("Answers")
}
}
...
private void onPropertyChanged(string propertyName)
{
if(this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Wenn ich weisen Sie ein neues List<string> Beantworten, dann wird das PropertyChanged-Ereignis ausgelöst, wie erwartet; aber wenn ich einen string für die Antwort-Liste mit der Liste der Add-Methode, dann PropertyChanged-Ereignis nicht ausgelöst.
Ich wurde erwägt, eine AddAnswer () - Methode meiner Klasse, die behandeln würden, den Aufruf der Listen - Methode Hinzufügen und nennen würde onPropertyChanged() von dort aus, aber ist das der richtige Weg, es zu tun? Gibt es eine elegantere Art und Weise, es zu tun?
Cheers,
KT
InformationsquelleAutor eponymous23 | 2010-06-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie aussetzen
ObservableCollection<string>
, die implementiert dieINotifyCollectionChange
Schnittstelle zu erhöhen, seine eigenen Termine ändern.Sollten Sie auch entfernen Sie die Eigenschaft setter; Die Sammlung sollte in den Eigenschaften nur gelesen werden.
Sollten Sie nicht erhöhen die
PropertyChanged
- Ereignis, wenn der Inhalt der Auflistung ändern.Schauen Sie durch die unbeantworteten Fragen, und zahlen es vorwärts, durch das teilen Ihres know-how. Diese Website funktioniert, weil die Menschen zurück geben.
Vielen Dank... !
InformationsquelleAutor SLaks
Ok, ich habe gerade endlich erfuhr dieses Problem, und es gibt KEINE vollständige Antworten auf die Internet-afaikt, so hier ist das fehlende Stück, das niemand erwähnt (vielleicht, weil Sie davon ausgehen, dass wir nicht komplette Idioten und NICHT gelöscht haben, der default-Konstruktor, oder haben alteast erweitert die Standard-Konstruktor), dennoch:
Stellen Sie sicher, dass Sie NICHT löschen Sie die InitializeComponent(); rufen Sie im Konstruktor der View.
Ohne diesen Aufruf, BEVOR Sie DataContext der view, NotifyPropertyChanged Event wird IMMER NULL SEIN. Ich verbrachte etwa 2 Stunden versucht herauszufinden, was anders war zwischen zwei verschiedenen MVVM-Benutzersteuerelemente. Ich denke, mein Verstand ist so zu sehen, verwendet InitializeComponent ();, dass es nicht zu registrieren, dass er fehlt. Ich fügte hinzu, dass Rücken und viola!
Hoffe, Dies Hilft Anderen Dummies Wie Mich!
Cheers,
Code Warrior Malo
Vielen Dank für diese! Ich hatte das gleiche Problem. Ich möchte meine Klasse als ein standard-C# - Klasse, aber nach der Umstellung ist es zu ein Forms, XAML code-behind-es begann (es scheint, Sie müssen den code im hintergrund-XAML, um die
InitializeComponent()
Methode funktioniert)InformationsquelleAutor Code WarriorMalo
Es ist nicht feuern, weil die Sammlung Referenz ändert sich nicht, nur die Inhalte. Sie müssten die Sammlung der Add () - Methode zum auslösen des Ereignisses in der Lage sein, um es zu sehen.
InformationsquelleAutor Josh Sterling
haben Sie einen Blick auf System.Sammlungen.ObjectModel.ObservableCollection. http://msdn.microsoft.com/en-us/library/ms668604.aspx
Es kann verwendet werden, wie eine Liste, hat aber Ereignisse gebaut, wenn deren Inhalt ändern.
InformationsquelleAutor William Leader
ObservableCollection ist Ihre Antwort. Wenn Sie möchten, um Feuer auf collection-Eigenschaft geändert wird, müssen Sie die INotifyPropertyChanged implementieren, die für jede der Eigenschaften, die Sie verfolgen möchten.
InformationsquelleAutor Robaticus
Sollten Sie einen Ereignis-listener hinzufügen Ihre
_answers
Sammlung. LeiderList<T>
keine solche ein Ereignis.Als Anregung, verwalten
_answers
alsObservableCollection<string>
und richtig attach/detach ein Ereignis-handler für dieCollectionChanged
Ereignis wie folgt:InformationsquelleAutor Humberto