如何在ViewModel中订阅PropertyChanged事件?

时间:2011-10-19 16:49:42

标签: c# mvvm inotifypropertychanged

我的核心功能封装在ViewModelBase

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

我如何实现这一目标?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup>
    {


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

3 个答案:

答案 0 :(得分:55)

通常我在类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;
    }
}

答案 1 :(得分:11)

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

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

基类:

protected virtual void OnMyValueChanged() { }

派生类:

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

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

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

答案 2 :(得分:2)

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

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

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

This article介绍了如何订阅DependencyProperty更改。