2011-10-19 50 views
11

我有核心功能封装在ViewModelBase我如何在我的ViewModel中订阅PropertyChanged事件?

现在我想看看ViewModelBase引发PropertyChanged事件,并采取行动。例如,在ViewModelBase上更改了一个属性时 - 我想更改ViewModel的属性

如何实现此目的?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup> 
    { 


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

您的'NotificationObject'是否实现'INotifyPropertyChanged'接口?如果是这样,那么这是基本的事件订阅。如果没有,那么你应该实现'INotifyPropertyChanged'。 –

回答

9

我很担心,你有效地做一个'手动绑定'(坏)派生类中的属性为基类上的值(也是不好的)。使用继承的要点是派生类可以访问基类中的东西。使用protected修饰符来指示事物应该只能由派生类访问。

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

基类:

protected virtual void OnMyValueChanged() { } 

派生类:

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

真的,订阅的事件中的基类的你写的这个班级看起来非常不可思议 - 如果你要在自己周围构思自己,那么使用继承而不是构图的意义何在?你真的要求一个对象在事情发生时告诉自己。方法调用是你应该使用的。

关于“当ViewModelBase上的一个属性发生变化时 - 我想更改ViewModel的属性” ......它们是同一个对象!

+0

是的,它确实有臭味:)我的场景是这样的...我有基本的功能,但在这种特殊情况下,我想重新排列我的ViewModel的一些数据,当一些基础数据发生变化时。基类维护主要数据实体(假设客户),我想更新客户变更时更多的UI – katit

+0

我仍然会建议使用方法而不是事件,如果需要,可以使用组合方式继承:创建一个包含基本ViewModel的新对象,否则每个人都可以访问基本的“基本”功能ViewModel,它实际上你似乎正在修改,所以派生类不适合 –

+0

也许方法是一种方式去另一个例子基类维护我的数据输入的“状态”形成。像NEW,EDIT,ADD。一堆UI绑定到这个状态。在我的VM中,我也想知道这种状态变化。我可以创建方法OnStateChange,或者我可以订阅PropertyChanged。你是否觉得需要重新构建或者只是创建方法?方法可能是“更干净”的看 – katit

2

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

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

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

This article描述如何订阅DependencyProperty的变化。

44

我通常使用注册到PropertyChanged事件在类的构造

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

和我的PropertyChanged事件处理程序是这样的:

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

反正有处理时摆脱“魔术弦”。 (我没有使用C#6) – Marshal

+0

@Marshal我不确定,那么[Josh Smith的博客文章](https://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to-避免-凌乱-的PropertyChanged事件搬运/)? – Rachel

+0

我认为这是一个很好的解决方案,并且足够可测试。感谢您指出文章。 – Marshal

相关问题