c# - 当模型中的属性更改时得到通知

标签 c# wpf mvvm

关于在模型中是否应实现INotifyPropertyChanged似乎存在矛盾的想法。我认为应该在ViewModel中实现它,但是我不知道如何实现。在stackoverlow.com(In MVVM model should the model implement INotifyPropertyChanged interface?In MVVM should the ViewModel or Model implement INotifyPropertyChanged?)上都多次提到相同的想法,但是我找不到任何示例来说明如何实现。

举例来说,假设我有一个人物模型:

Public Person {
  public int Age { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public void NameChange( string newName );
}

如何实现ViewModel,以便识别AgeFirstNameLastName中的所有更改?
Public PersonViewModel : INotifyPropertyChanged {
  Person _person;
  public event PropertyChangedEventHandler PropertyChanged;
  void OnPropertyChanged(string propertyName) {
    if(this.PropertyChanged != null)
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
  }
  //ctor, Properties, etc...
}

编辑-澄清:

因此,而不更改Person模型,我如何修改ViewModel以获得更新通知?

那有可能吗?如果不是,那么那些订阅“模型中的INPC是baaaad”的人如何收到模型更改的通知?

最佳答案

有趣的问题。我已经阅读了MVVM一年多了,但我仍然不确定。

例如,如果您的应用程序表示流程的状态,并且在内部修改了该状态而无需用户进行任何交互,则您的模型需要能够通知您的 View 模型它已更改。
因此,如果您的模型实现INotifyPropertyChanged,并且您的 View 模型仅将相同的信息传递给 View ,那么...您的 View 模型真的需要存在吗?

在我们公司中,我们考虑两种主要情况:

  • 在开发之前(不那么敏捷),我们通过相当严格的UML分析来构建软件。然后,当我们想在屏幕上显示对象时,它们将向我们返回其不同的 View ,这些 View 将在需要时与Bindings结合使用(使用ContentControl左右)。我们软件所需的大多数 View 都显示此类对象,这些对象实现了INotifyPropertyChanged,因此也是一种ViewModel。
  • 要构建软件主 View ( View 结构),我们为其创建全局 View 和ViewModel。那是我们真正遵循MVVM实践的时候。

  • 也许我错过了有关MVVM的观点,但是根据我的经验,这并不是您绝对必须始终遵循的模式。这是开发WPF应用程序的一种非常好的思考方式,但是在我看来,为每个 View 创建ViewModels似乎是一大开销。

    你们所有人对这种方式有何看法?

    最好的祝福,

    安托万

    编辑31.03.2012

    我发现了一篇非常有趣的文章,解释了如何在viewmodel中处理模型属性,而不必在viewModel中为每个模型属性实现代理属性。
    此外,作者还说了一些有关在模型中实现INPC的观点,以及对模型进行监听的话。
    我认为这是到目前为止我阅读的有关MVVM的最实用的文章。
    一探究竟 :
    http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

    关于c# - 当模型中的属性更改时得到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9931323/

    相关文章:

    c# - Umbraco 中的母版页

    c# - 我添加了一个用户并将他分配给一个角色,当我使用 Membership.GetAllUsers() 时它没有返回

    c# - 将 SelectedItem 传递给 DataTemplate 中 UserControl 的 ViewModel

    qt - 将字符串或其他非列表/树类型绑定(bind)到 qt 小部件的简单模型(mvvm 样式)

    c# - 将新项目添加到 CSLA EF4 模式

    c# - 获取计数和名称

    javascript - 如何创建函数以在后端验证下拉列表

    c# - 是否可以更改 Extended WPF Toolkit 的 Busyindicator 中的忙碌动画?

    c# - WPF CollectionView/DataGrid 获取第一个可见项的索引

    wpf - 将IEnumerable <T>与ObservableCollection <T>包装在一起