MVVM使用INotifyPropertyChanged模型而不通知ViewModel

Ric*_*ins 4 c# silverlight mvvm windows-phone-7 windows-phone-7.1

我是第一次尝试使用MVVM.我有一个Windows Phone应用程序(Mango),它有一个模型类,一个视图模型类和一个视图xaml页面.我有控制(文本框)绑定到VM,并且VM绑定到模型.

模型和视图模型都实现INotifyPropertyChanged.我正在使用的实现被复制,以便我可以使用它来试图弄清楚我正在用INPC做什么.以下是两个类中列出的代码:

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
   if (PropertyChanged != null)
   {
      PropertyChanged(this, new PropertyChangedEventArgs(info));
   }
}
Run Code Online (Sandbox Code Playgroud)

我在Model类中有一个属性,可以手动(从文本框)设置或计算(通过更改其他属性之一).我们称之为一个结果.

如果我更改其他属性之一并逐步执行,则在Model类中的changed属性和重新计算的属性中调用INPC,尽管PropertyChangednull,因此跳过了部分代码.然后在VM中,已更改的属性逐步执行该类'INPC(作为set访问器的一部分),而这次PropertyChanged不是null,因此PropertyChanged调用该方法.Result但是,对于属性,不会引发INPC(该属性没有由其他属性的set访问器调用的INPC).

这是Model中的一个属性,它不是计算属性:

public int AgeSetting
{
   get
   {
      return (int)GetValueOrDefault(AgeSettingKeyName, AgeSettingDefault);
   }
   set
   {
      AddOrUpdateValue(AgeSettingKeyName, value);
      Calculate();
   }
}
Run Code Online (Sandbox Code Playgroud)

以下是模型中计算值的属性.

public int PointsSetting
{
   get
   {
      return (int)GetValueOrDefault(PointsSettingKeyName, PointsSettingDefault);
   }
   set
   {
      AddOrUpdateValue(PointsSettingKeyName, value);
   }
}
Run Code Online (Sandbox Code Playgroud)

从ViewModel,这里有两个属性:

public int Age
{
   get
   {
      return person.AgeSetting;
   }
   set
   {
      person.AgeSetting = value;
      NotifyPropertyChanged("Age");
   }
} 

public int PointsAllowed
{
   get
   {
      return person.PointsSetting;
   }
   set
   {
      person.PointsSetting = value;
      NotifyPropertyChanged("PointsAllowed");
   }
}
Run Code Online (Sandbox Code Playgroud)

从来没有这样做过,我期待INPC应该从模型类,VM类和UI中冒出来.它似乎没有那样工作.

我知道Result(计算)属性正在改变,因为我可以离开页面并返回,并且新显示的值是正确的.我只是不知道如何从模型中的计算值,到视图模型,直到视图.

谢谢你的任何建议.

Bas*_*Bas 5

如果计算属性的值更改,还会引发该属性的PropertyChanged事件.这意味着当单个属性更改时,可能会为多个属性触发事件.

此外,如果您的设计中可能/智能,您可以直接绑定到模型属性并使模型成为ViewModel的属性.这减少了很多代码的维护.