阅读Josh Smiths article about MVVM他的视图模型 CustomerViewModel
实现 INotifyPropertyChanged
但不是底层的 Customer
类 .
在这种情况下,我只能看到一种(可行的)方法来改变通知工作 - 只对 CustomerViewModel
而不是 Customer
进行更改 . 在这种情况下,我的程序的后端逻辑是否也只是针对ViewModels?这看起来很奇怪,毕竟他们是View Models .
有人可以澄清这一点吗?
谢谢!
澄清:
假设我有一个模型报价和行情列表 .
public class Quote
{
public string Name { get; set; }
public decimal Value { get; set; }
}
public QuoteViewModel : INotifyPropertyChanged
{
private Quote quote;
public event EventHandler PropertyChanged;
public decimal Value
{
get { return quote.Value; }
set
{
quote.Value = value;
PropertyChanged("Value");
}
}
}
现在,如果由于后台线程轮询Web服务而引用更改,则不会通知UI,因为除非系统的所有部分都使用ViewModel,否则引用不会实现INotifyPropertyChanged?
2 回答
我猜测在他的例子中,他正在使用通知将视图的一部分的更改传播到视图的其他部分 . 由于不同的部分可能被绑定到相同的视图模型,因此这将起作用 .
重新 logic 验证;无论如何,我可能不会以变革事件为基础;首先是因为这将是很多甚至订阅(对比UI,你只关注UI关心的东西),其次它可能太重要,不能冒险丢失; p如果模型没有在内部执行验证(因为变化发生)然后我会在提交之前显式运行验证逻辑,完全查看成员 . 这也避免了"briefly inconsistent"问题,即您计划进行多次更改以产生有效模型,但如果您立即验证,找到允许您进行所需更改的序列或者完全不可能 . 通过推迟验证,这就消失了 .
Marc提出了一些很好的观点,但听起来你确实需要在UI的上下文之外修改模型 . 考虑在你的模型上实现INotifyPropertyChanged,但正如Marc所提到的,这可能会有点问题,当然需要进行大量测试 . 如果您的模型是POCO,这种方法最有效 . 如果它可以兼作所有使用它的VM中暴露的伪造的VM,那么也许你可以最小化或消除VM->模型事件订阅: