data bindingcontext c# mvvm inotifypropertychanged

c# - bindingcontext - ¿Cómo me suscribo al evento PropertyChanged en mi ViewModel?



xamarin viewmodel (3)

La forma directa de suscribirse a los cambios de propiedad es usar INotifyPropertyChanged si su BaseViewModel implementa:

PropertyChanged += (obj, args) => { System.Console.WriteLine("Property " + args.PropertyName + " changed"); }

Si no lo hace, entonces tiene que ser un DependencyObject , y sus propiedades tienen que ser DependencyProperties (que probablemente sea una forma más complicada).

Este artículo describe cómo suscribirse a DependencyProperty cambios DependencyProperty .

Tengo la funcionalidad central encapsulada en ViewModelBase

Ahora quiero ver cuándo el evento PropertyChanged fue generado por ViewModelBase y actuar sobre él. Por ejemplo, cuando se cambió una propiedad en ViewModelBase, quiero cambiar la propiedad en mi ViewModel

¿Cómo logro esto?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup> { public abstract class BaseViewModel<T> : NotificationObject, INavigationAware where T : Entity {


Me preocupa que esté haciendo efectivamente un ''enlace manual'' (malo) para una propiedad en una clase derivada a un valor en la clase base (también malo). El punto central del uso de la herencia es que la clase derivada puede acceder a cosas en la clase base. Use un modificador protected para indicar que las cosas solo deben ser accesibles a las clases derivadas.

Sugeriría este (potencialmente) método más correcto:

Clase base

protected virtual void OnMyValueChanged() { }

Clase derivada:

protected override void OnMyValueChanged() { /* respond here */ }

En realidad, suscribirse a un evento en la clase base de la misma clase que está escribiendo simplemente parece increíblemente al revés. ¿Cuál es el sentido de usar la herencia sobre la composición si se va a componer a su alrededor? Literalmente estás pidiendo a un objeto que se diga a sí mismo cuando algo sucede. Un método llamado es lo que deberías usar para eso.

En términos de "cuando se cambió una propiedad en ViewModelBase, quiero cambiar la propiedad en mi ViewModel" , ... ¡son el mismo objeto!


Usualmente uso registro en el evento PropertyChanged en la clase Constructor

public MyViewModel() { this.PropertyChanged += MyViewModel_PropertyChanged; }

y mi controlador de eventos PropertyChanged se ve así:

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case "SomeProperty": // Do something break; } }