【问题标题】:MvvM ViewModel to ViewModel CommunicationMvvM ViewModel 到 ViewModel 通信
【发布时间】:2012-11-27 13:56:35
【问题描述】:

我有两个视图模型ViewModelAViewModelB,它们都使用公共DataServiceA 来检索名为Theme 的用户设置。 ViewModelB 可以更改该设置并将其保存到数据库中。发生这种情况时,ViewModelA 不会更新该主题值。
我一直在尝试找出正确的行动方案以允许它也对其进行更新,并提出了一些选择:

  1. 让 DataService 在保存值时引发属性通知(我不喜欢这样)
  2. 使用 MessengerService 使它们保持同步。 (我遇到了消息循环问题)
  3. 将一个 ViewModel 传递给另一个

有什么想法吗?

【问题讨论】:

  • 你考虑过使用事件吗?如果 ViewModelB 将数据保存到主题,它可以引发事件。 ViewModelA 可以订阅事件并调用数据服务来刷新其主题版本。反之亦然。

标签: c# mvvm viewmodel mvvm-light


【解决方案1】:

听起来是使用事件的好例子,如果他们都可以访问 DataServiceA,当主题改变时你能不引发事件吗?

所以.. 在 DataServiceA 中,修改主题时会引发“OnThemeChanged”事件,并且 ViewModel 可以订阅该事件并在引发时更新其内容。

【讨论】:

    【解决方案2】:

    如果他们都使用DataServiceA 的相同实例,我认为DataServiceA 也将实现INotifyPropertyChanged 并在@ 987654325@属性变化。

    但如果您不喜欢这个想法,另一种选择是使用 EventAggregator 并发布活动。我个人认为第一个选项已经足够了,但这是你的决定......

    【讨论】:

    • 我是 MVVM 和 MVVM light 的新手,出于某种原因,我觉得绑定到数据服务中的属性违反了它的意图
    • 从 ViewModel 绑定到 Model 是可以的...有些人甚至将 Model 作为 Public Property 放在 ViewModel 上,以便 View 可以看到它。其他人将所有模型字段公开为 ViewModel 上的属性,因此视图将无法访问模型本身 - 这两种方法都不会破坏 MVVM 模式
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多