我第一次尝试使用 MVVM。我的 Windows Phone 应用程序(Mango)有一个模型类、一个视图模型类和一个视图 XAML 页面。我有一些控件(文本框)与 VM 绑定,VM 与模型绑定。
模型和视图模型都实现了 INotifyPropertyChanged 接口。我使用的实现是复制的,这样我就可以尝试弄清楚如何使用 INPC。以下是两个类中列出的代码:
我在 Model 类中有一个属性,可以手动设置(来自文本框)或通过更改其他属性进行计算。我们称之为“Result”。
如果我更改其他属性,并逐步执行,INPC 将在 Model 类中的更改属性和重新计算属性中调用,尽管 “PropertyChanged” 为“null”,所以该代码部分将被跳过。然后在 VM 中,已更改的属性会逐步执行该类的 INPC(作为 set 访问器的一部分),这时候“PropertyChanged” 不为“null”,因此将调用“PropertyChanged” 方法。然而,“Result” 属性没有引发 INPC(该属性不是由其他属性的 set 访问器引发的)。
以下是 Model 中的一个属性,它不是计算属性:
从 ViewModel 中,以下是这两个属性:
模型和视图模型都实现了 INotifyPropertyChanged 接口。我使用的实现是复制的,这样我就可以尝试弄清楚如何使用 INPC。以下是两个类中列出的代码:
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
我在 Model 类中有一个属性,可以手动设置(来自文本框)或通过更改其他属性进行计算。我们称之为“Result”。
如果我更改其他属性,并逐步执行,INPC 将在 Model 类中的更改属性和重新计算属性中调用,尽管 “PropertyChanged” 为“null”,所以该代码部分将被跳过。然后在 VM 中,已更改的属性会逐步执行该类的 INPC(作为 set 访问器的一部分),这时候“PropertyChanged” 不为“null”,因此将调用“PropertyChanged” 方法。然而,“Result” 属性没有引发 INPC(该属性不是由其他属性的 set 访问器引发的)。
以下是 Model 中的一个属性,它不是计算属性:
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(已计算)属性正在更改,因为我可以离开页面并返回,新显示的值是正确的。我只是不知道如何从模型中的计算值到达视图模型,然后再到达视图。
感谢您的任何建议。