【发布时间】:2011-11-17 07:23:18
【问题描述】:
我是第一次尝试使用 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 类中有一个属性,可以手动设置(从文本框)或计算(通过更改其他属性之一)。让我们称之为一个结果。
如果我更改其他属性之一并逐步执行,则在 Model 类中更改的属性和重新计算的属性中都会调用 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();
}
}
这是模型中计算值的属性。
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) 属性正在发生变化,因为我可以离开页面并返回,并且新显示的值是正确的。我只是不知道如何从模型中的计算值到视图模型,再到视图。
感谢您的任何建议。
【问题讨论】:
-
一个有用的工具是 VS 中的输出窗口。这将告诉您在启动应用程序/初始化 UI 时是否有任何绑定失败。可能是您的绑定不正确。
-
我没有意识到这一点。谢谢你。但是,绑定正在工作,因为它确实将存储在 isolatedstoragesettings 中的值拉入文本框
-
我没有时间弄清楚你真正要问的是什么,所以请你给我一个最爱和edit your title,这样这是一个与你的问题有关的实际问题'再问?仅有机地使用标签的奖励积分。谢谢!
-
有机地使用标签。这是什么意思?
标签: c# silverlight windows-phone-7 mvvm windows-phone-7.1