我第一次尝试使用 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));
}
}
我在 Model 类中有一个属性,可以手动设置(从文本框)或计算(通过更改其他属性之一)。让我们称之为一个结果。
如果我更改其他属性之一,并逐步执行,INPC 会在 Model 类中的已更改属性和重新计算的属性中调用,尽管PropertyChanged
is null
,因此会跳过该部分代码。然后在 VM 中,被更改的属性会通过该类的 INPC(作为 set 访问器的一部分),而这次PropertyChanged
不是null
,因此PropertyChanged
调用该方法。但是,对于该Result
属性,不会引发 INPC(该属性没有由其他属性的 set 访问器调用的 INPC)。
这是模型中的属性之一,它不是计算的属性:
public int AgeSetting
{
get
{
return (int)GetValueOrDefault(AgeSettingKeyName, AgeSettingDefault);
}
set
{
AddOrUpdateValue(AgeSettingKeyName, value);
Calculate();
}
}
这是模型中计算值的属性。
public int PointsSetting
{
get
{
return (int)GetValueOrDefault(PointsSettingKeyName, PointsSettingDefault);
}
set
{
AddOrUpdateValue(PointsSettingKeyName, value);
}
}
在 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");
}
}
以前从未这样做过,我期待 INPC 应该从模型类冒泡到 VM 类,再到 UI。它似乎不是那样工作的。
我知道 Result (calculated) 属性正在发生变化,因为我可以离开页面并返回,并且新显示的值是正确的。我只是不知道如何从模型中的计算值到视图模型,再到视图。
感谢您的任何建议。