2011-10-19 15 views
11

que tienen funcionalidad del núcleo encapsulado en ViewModelBase¿Cómo me suscribo al evento PropertyChanged en mi ViewModel?

Ahora quiero ver cuando el evento PropertyChanged fue levantado por ViewModelBase y actuar en consecuencia. Por ejemplo, cuando una propiedad se modificó en ViewModelBase - Deseo 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 
    { 
+1

¿Su 'NotificationObject' implementa la interfaz' INotifyPropertyChanged'? Si es así, entonces es la suscripción al evento básico. Si no, entonces debe implementar 'INotifyPropertyChanged'. –

Respuesta

9

Me preocupa que usted está haciendo efectivamente un " vinculación manual '(mala) para una propiedad en una clase derivada a un valor en la clase base (también mala). El objetivo de usar 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 deberían ser accesibles para las clases derivadas.

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

clase Base:

protected virtual void OnMyValueChanged() { } 

clase derivada:

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

Realmente, la suscripción a un evento en la clase base de la misma clase que estás escribiendo parece increíblemente al revés: ¿de qué sirve usar la herencia sobre la composición si te vas a componer a tu alrededor? Estás literalmente pidiendo a un objeto que se diga a sí mismo cuando sucede algo. Una llamada a método es lo que deberías usar para eso.

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

+0

Sí, huele :) Mi escenario es así ... Tengo funcionalidad básica, pero en este caso específico quiero reorganizar algunos de los datos en mi ViewModel cuando cambien algunos datos base. La clase base mantiene la entidad de datos principal (digamos Cliente) y quiero actualizar más UI cuando el cliente cambie. – katit

+0

Sugeriría usar métodos en lugar de eventos, y usar composición sobre herencia si es necesario: crear un nuevo objeto que contenga el modelo de vista base. De lo contrario, todos seguirán teniendo acceso a la funcionalidad 'base' de la base ViewModel, que en realidad pareces estar modificando, por lo que una clase derivada no encaja. –

+0

Tal vez el método sea un camino por recorrer. Otro ejemplo. La clase base mantiene el "estado" de mi entrada de datos formar. Me gusta NEW, EDIT, ADD. Un montón de UI se une a este estado. En mi máquina virtual, también quiero saber sobre este cambio de estado. Puedo crear el método OnStateChange o puedo suscribirme a PropertyChanged. ¿Ves la necesidad de recomponer o simplemente crear métodos? Los métodos pueden ser "más limpios" para mirar – katit

2

La forma más directa para suscribirse a los cambios de propiedad está usando 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 que ser DependencyProperties (que es probablemente una forma más complicada).

This article describe cómo suscribirse para DependencyProperty cambios.

44

Normalmente utilizo registro para el evento PropertyChanged en el constructor de la clase

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

y mi controlador de eventos PropertyChanged se parece a esto:

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

¿Hay alguna forma de deshacerse de "magic-strings" durante el manejo? (No estoy usando C# 6) – Marshal

+0

@Marshal No estoy seguro, ¿qué pasa con [esta publicación del blog por Josh Smith] (https://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to- avoid-messy-propertychanged-event-handling /)? – Rachel

+0

Creo que es una buena solución y suficientemente verificable. Gracias por señalar el artículo. – Marshal

Cuestiones relacionadas