Como faço para assinar o evento PropertyChanged no meu ViewModel?

Eu tenho a funcionalidade principal encapsulada em ViewModelBase

Agora eu quero ver quando o evento PropertyChanged foi gerado por ViewModelBase e agir sobre ele. Por exemplo, quando uma propriedade foi alterada em ViewModelBase – eu quero alterar a propriedade no meu ViewModel

Como faço para conseguir isso?

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

Estou preocupado que você esteja efetivamente fazendo uma ‘binding manual’ (ruim) para uma propriedade em uma class derivada com um valor na class base (também ruim). O ponto inteiro de usar inheritance é que a class derivada pode acessar coisas na class base. Use um modificador protected para indicar que as coisas só devem ser acessíveis para classs derivadas.

Eu sugeriria este método (potencialmente) mais correto:

Classe base:

 protected virtual void OnMyValueChanged() { } 

Classe derivada:

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

Realmente, inscrever-se em um evento na class base da própria class que você está escrevendo parece inacreditavelmente retrógrado – qual é o sentido de usar a inheritance sobre a composição para compor você mesmo? Você está literalmente pedindo a um object para dizer a si mesmo quando algo acontece. Uma chamada de método é o que você deve usar para isso.

Em termos de “quando uma propriedade foi alterada no ViewModelBase – eu quero alterar a propriedade no meu ViewModel” , … eles são o mesmo object!

Normalmente eu uso o registro para o evento PropertyChanged na class Construtor

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

e meu manipulador de events PropertyChanged se parece com isso:

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

A maneira direta de se inscrever em mudanças de propriedade é usando INotifyPropertyChanged se o seu BaseViewModel implementar:

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

Se não, então tem que ser um DependencyObject , e suas propriedades devem ser DependencyProperties (que é provavelmente uma maneira mais complicada).

Este artigo descreve como se inscrever para alterações DependencyProperty .