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,尽管PropertyChanged是null,因此跳过了部分代码.然后在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(计算)属性正在改变,因为我可以离开页面并返回,并且新显示的值是正确的.我只是不知道如何从模型中的计算值,到视图模型,直到视图.
谢谢你的任何建议.
如果计算属性的值更改,还会引发该属性的PropertyChanged事件.这意味着当单个属性更改时,可能会为多个属性触发事件.
此外,如果您的设计中可能/智能,您可以直接绑定到模型属性并使模型成为ViewModel的属性.这减少了很多代码的维护.