首页 文章

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

提问于
浏览
7

阅读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 回答

  • 2

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

    重新 logic 验证;无论如何,我可能不会以变革事件为基础;首先是因为这将是很多甚至订阅(对比UI,你只关注UI关心的东西),其次它可能太重要,不能冒险丢失; p如果模型没有在内部执行验证(因为变化发生)然后我会在提交之前显式运行验证逻辑,完全查看成员 . 这也避免了"briefly inconsistent"问题,即您计划进行多次更改以产生有效模型,但如果您立即验证,找到允许您进行所需更改的序列或者完全不可能 . 通过推迟验证,这就消失了 .

  • 0

    Marc提出了一些很好的观点,但听起来你确实需要在UI的上下文之外修改模型 . 考虑在你的模型上实现INotifyPropertyChanged,但正如Marc所提到的,这可能会有点问题,当然需要进行大量测试 . 如果您的模型是POCO,这种方法最有效 . 如果它可以兼作所有使用它的VM中暴露的伪造的VM,那么也许你可以最小化或消除VM->模型事件订阅:

    public QuoteViewModel : INotifyPropertyChanged
    {
      private Quote quote;
      public event EventHandler PropertyChanged;
      public INotifyPropertyChanged Quote
      {
        get { return quote; }
        set
        {
          quote = value;
          PropertyChanged("Quote");
        }
      }
    }
    

相关问题