如果模型未实现INotifyPropertyChanged,View Models如何从其基础模型传播更改通知?

Max*_*Max 7 .net c# wpf mvvm

阅读Josh Smiths关于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");
         }
    }                  
}
Run Code Online (Sandbox Code Playgroud)

现在,如果由于后台线程轮询Web服务而引用更改,则不会通知UI,因为除非系统的所有部分都使用ViewModel,否则引用不会实现INotifyPropertyChanged?

Mar*_*ell 2

我猜测在他的示例中,他正在使用通知将对视图一部分的更改传播到视图的其他部分。由于不同的部分可能绑定到相同的视图模型,因此这是可行的。

重新逻辑验证;无论如何,我可能不会将其基于变更事件;首先,因为这将是很多均匀的订阅(对比 UI,你只绑定 UI关心的东西),其次,它可能太重要了,不能冒丢失的风险;p 如果模型没有在内部执行验证(当发生更改时) )然后我会在提交之前显式运行验证逻辑,同时查看成员。这也避免了“短暂不一致”的问题,即您计划进行多项更改以产生有效的模型,但如果您立即验证,那么要么很难找到允许您进行所需更改的序列,要么是完全不可能的。通过推迟验证,这种情况就会消失。

  • @Max - 后台线程更新绑定到 UI 的对象*已经*是一个非常危险的场景,因为仅仅处理事件是不够的 - 它需要进行线程切换等。事实上,它不会'我无法处理这种情况,但事情是这样的:模型需要设计为仅处理它们“实际”会遇到的事情。大多数模型不需要处理您呈现的场景。如果您的模型*确实*需要这一点,那么它将需要以更复杂的方式进行设计(和测试)。但除非需要,否则不要添加它;p (3认同)