【问题标题】:How to notify parent view model of datagrid changes using MVVM?如何使用 MVVM 通知父视图模型的数据网格更改?
【发布时间】:2013-09-17 13:29:17
【问题描述】:

我已经阅读了该站点上有关处理数据网格更改的大量帖子。普遍的共识似乎是数据网格项目应该实现 INotifyPropertyChanged,然后在 OnPropertyChanged() 中执行任何必要的操作。 但是,当考虑到视图模型和模型时,我不太清楚推荐的做法是什么。

假设我的模型有许多字段和多个不同类型的项目列表。项目列表作为 ItemSource 绑定到相应视图中的数据网格。在我的视图模型(或模型)中,我希望有一个标志(例如“IsDirty”),它告诉我字段和/或列表项中是否有任何更改。

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

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

谢谢。

【问题讨论】:

    标签: wpf mvvm datagrid


    【解决方案1】:

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

    通常只有三个用例

    1. 子项属性已更新
    2. 子项已添加到 Children 集合中
    3. 子项已从 Children 集合中删除。

    最简单的解决方案是创建ObservableCollection<Child> 类型的Children 属性并挂钩到CollectionChanged 事件。每当从集合中添加或删除 Child 时,都会触发此事件。在这种情况下,您可以捕获您需要的所有数据:

    1. 在父级初始化时,将所有初始子级添加到集合中,并在执行此操作时连接到每个子级的 OnPropertyChanged 事件,并在属性更改时切换 IsDirty。初始化后,...
    2. 添加了孩子 - 挂钩到孩子的 OnPropertyChanged 事件并切换 IsDirty
    3. 子项已删除 - 从子项的 OnPropertyChanged 事件中解除挂钩。

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 2012-01-19
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多