如何使用MVVM通知datagrid更改的父视图模型?

时间:2013-09-17 13:29:17

标签: wpf mvvm datagrid

我在本网站上阅读了很多关于处理datagrid变更的帖子。普遍的共识似乎是datagrid项应该实现INotifyPropertyChanged,然后在OnPropertyChanged()中执行任何必要的操作。 但是,当考虑视图模型和模型时,我不太清楚建议的做法是什么。

假设我的模型有很多字段和多种不同类型的项目列表。项目列表作为ItemSource绑定到相应视图中的datagrids。在我的视图模型(或模型)中,我想要一个标志(例如'IsDirty'),告诉我在字段和/或列表项中是否有任何更改。

处理对字段所做的更改很简单,因为它们在视图模型中将调用相应的OnPropertyChanged()。但是,数据网格项“OnPropertyChanged()”将在项目本身中调用。

如何让父视图模型(或模型)知道对其中一个datagrids中的某个项进行了更改?显然,我可以为每个项目提供对其父视图模型(或模型)的引用,但我想知道是否有更好的推荐做法。

感谢。

1 个答案:

答案 0 :(得分:1)

维护父级IsDirty属性最简单的方法就是通过监听子项“OnPropertyChanged事件,结合使用ObservableCollections和CollectionChanged事件。

通常只有三个用例

  1. 子项目属性已更新
  2. 子项目已添加到Children集合
  3. 子项目已从Children集合中删除。
  4. 最简单的解决方案是创建Children&gt;类型的ObservableCollection<Child属性。并挂钩到CollectionChanged事件。只要在集合中添加或删除子项,就会触发此事件。在这种情况下,您可以捕获所需的所有数据:

    1. 在父级初始化时,将所有初始子级添加到集合中,同时挂钩到每个OnPropertyChanged事件中,每当属性发生更改时切换IsDirty。初始化后,......
    2. 添加了孩子 - 挂钩孩子的OnPropertyChanged事件并切换IsDirty
    3. 已删除子项 - 摘自Child的OnPropertyChanged事件。