Wie abonniere ich PropertyChanged-Ereignis in meinem ViewModel?
Habe ich core-Funktionalität in ViewModelBase
Jetzt will ich sehen, wenn PropertyChanged-Ereignis ausgelöst wurde durch ViewModelBase und zu handeln. Zum Beispiel, wenn eine Eigenschaft geändert wurde, auf ViewModelBase - das will ich ändern-Eigenschaft auf meinem ViewModel
Wie kann ich das erreichen?
public class MaintainGroupViewModel : BaseViewModel<MEMGroup>
{
public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
where T : Entity
{
Hat Ihr
NotificationObject
implementieren INotifyPropertyChanged
- Schnittstelle? Wenn ja, dann ist es grundlegende Ereignis-Abonnement. Wenn nicht, dann sollten Sie implementieren INotifyPropertyChanged
.InformationsquelleAutor katit | 2011-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin besorgt, dass Sie effektiv zu tun, eine 'manuelle Bindung' (bad) für eine Eigenschaft in einer abgeleiteten Klasse einen Wert auf die Basisklasse (auch schlecht). Der springende Punkt bei der Vererbung ist, dass die abgeleitete Klasse zugreifen können, die Dinge, die in der Basisklasse. Verwenden Sie eine
protected
modifier anzugeben Dinge sollte nur zugänglich sein abgeleitete Klassen.Ich würde vorschlagen, diese (potentiell) mehr richtige Methode:
Basisklasse:
Abgeleitete Klasse:
Wirklich, bei der Anmeldung zu einer Veranstaltung, die in der base-Klasse, sehr Klasse, Sie schreiben scheint einfach unglaublich nach hinten - was ist der Sinn von Vererbung über die Zusammensetzung, wenn Sie gehen, um zu Komponieren, sich um sich selbst? Sie sind buchstäblich zu Fragen, ein Objekt zu sagen, selbst wenn etwas passiert. Ein Methodenaufruf ist, was Sie verwenden sollten.
In Bezug auf ", wenn eine Eigenschaft geändert wurde, auf ViewModelBase - das will ich ändern-Eigenschaft auf meinem ViewModel", ... Sie sind das gleiche Objekt!
Ich würde noch empfehlen die Verwendung von Methoden, die eher als Ereignisse, und mit Komposition über Vererbung, falls erforderlich: erstellen Sie ein neues Objekt, das enthält die Basis-ViewModel. Sonst wird jeder noch Zugriff auf die "Basis" Funktionalität der Basis-ViewModel, welches eigentlich scheinen Sie zu ändern, so dass eine abgeleitete Klasse nicht passt.
Vielleicht-Methode ist ein Weg zu gehen. Ein weiteres Beispiel. Basis-Klasse verwaltet "Zustand" meiner Daten-Eingabe-Formular. Wie NEU, BEARBEITEN, HINZUFÜGEN. Reihe von UI-Bindungen zu diesem Staat. In meiner VM, ich will wissen, über diesen Zustand zu ändern, so gut. Ich kann OnStateChange-Methode oder ich kann PropertyChanged abonnieren. Sehen Sie brauchen, um neu-zusammensetzen-oder Sie erstellen einfach Methoden? Methoden werden könnte "sauberer" zu betrachten
Diese Funktionen gehören in der Basis-Ansicht Modell - vor allem für etwas so allgemein wie OnStateChange. Können Sie uns ein Beispiel? 🙂
Ich habe es. Im Grunde, das abonnieren von eigenen events ist ein code smell. Überschreiben OnStateChange und Aufruf von base.OnStateChange ist ein richtiger Weg, um dieses Szenario zu behandeln. Beide Arten von gleicher Funktionalität.
InformationsquelleAutor Kieren Johnstone
Normalerweise verwende ich registrieren, um den
PropertyChanged
event im Konstruktor der Klasseund meine PropertyChanged-Ereignishandler wie folgt aussieht:
Ich bin mir nicht sicher, was diesem blog-post von Josh Smith?
Ich denke, das ist eine gute Lösung, und testbare genug. Danke für den Hinweis zu dem Artikel.
Was denken Sie über die Nutzung dieser Technik vermeiden Sie auch den "Duplizieren" RaisePropertyChanged für die Kaskadierung Nur-Lese-Eigenschaften" ("stackoverflow.com/questions/46314677/...)?
Ich denke, es ist in Ordnung. Hinterlassen Sie eine Antwort auf Ihre Frage 🙂
InformationsquelleAutor Rachel
Den direkten Weg zu abonnieren, um bei änderungen der Eigenschaft ist mit
INotifyPropertyChanged
wenn IhrBaseViewModel
implementiert:Wenn es nicht klappt, dann muss es eine
DependencyObject
, und Ihre Eigenschaften zuDependencyProperties
(und das ist wohl komplizierter).Dieser Artikel beschreibt abonnieren für
DependencyProperty
änderungen.InformationsquelleAutor Vlad