如何在ViewModel中订阅PropertyChanged事件?

我有封装在ViewModelBase核心function

现在我想查看ViewModelBase引发PropertyChanged事件的时间并对其进行操作。 例如,在ViewModelBase上更改了一个属性时 – 我想在ViewModel上更改属性

我该如何实现这一目标?

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

我担心你有效地对派生类中的属性进行’手动绑定’(坏)到基类的值(也很糟糕)。 使用inheritance的重点是派生类可以访问基类中的东西。 使用protected修饰符指示只应对派生类访问事物。

我建议这个(可能)更正确的方法:

基类:

 protected virtual void OnMyValueChanged() { } 

派生类:

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

真的,订阅你正在编写的那个类的基类中的一个事件似乎是令人难以置信的倒退 – 如果你要围绕自己构建自己,那么使用inheritance而不是组合是什么意思? 当事情发生时,你真的要求一个物体告诉自己。 方法调用是您应该使用的方法。

“在ViewModelBase上更改一个属性时 – 我想在我的ViewModel上更改属性” ,……它们是同一个对象!

通常我在类Constructor中使用register到PropertyChanged事件

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

我的PropertyChanged事件处理程序如下所示:

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

订阅属性更改的直接方法是使用INotifyPropertyChanged如果您的BaseViewModel实现它:

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

如果没有,则它必须是DependencyObject ,并且您的属性必须是DependencyProperties (这可能是一种更复杂的方式)。

本文介绍如何订阅DependencyProperty更改。