gpt4 book ai didi

c# - MVVM 使用 INotifyPropertyChanged Model 不通知 ViewModel

转载 作者:太空狗 更新时间:2023-10-30 00:21:06 25 4
gpt4 key购买 nike

我是第一次尝试使用 MVVM。我有一个 Windows Phone 应用程序 (Mango),它有一个模型类、一个 View 模型类和一个 View xaml 页面。我有绑定(bind)到 VM 的控件(文本框),并且 VM 绑定(bind)到模型。

模型和 View 模型都实现了 INotifyPropertyChanged。我正在使用的实现是复制的,这样我就可以用它来弄清楚我在用 INPC 做什么。这是两个类中列出的代码:

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}

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

如果我更改其他属性之一,并单步执行,INPC 将在模型类中更改的属性和重新计算的属性中调用,尽管 PropertyChangednull,所以这部分代码被跳过了。然后在 VM 中,更改的属性逐步通过该类的 INPC(作为设置访问器的一部分),这次 PropertyChanged 不是 null,因此 PropertyChanged 方法被调用。但是,对于 Result 属性,不会引发 INPC(该属性没有被其他属性的设置访问器调用的 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。它似乎不是那样工作的。

我知道结果(计算的)属性正在更改,因为我可以离开页面并返回,并且新显示的值是正确的。我只是不知道如何从模型中的计算值到 View 模型,再到 View 。

感谢您的任何建议。

最佳答案

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

此外,如果在您的设计中可能/聪明,您可以直接绑定(bind)到模型属性并使模型成为您的 ViewModel 的属性。这大大减少了代码维护。

关于c# - MVVM 使用 INotifyPropertyChanged Model 不通知 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com