【问题标题】:WPF MVVM OnPropertyChanged Two ViewModels CommunicationWPF MVVM OnPropertyChanged 两个 ViewModel 通信
【发布时间】:2011-12-16 19:10:46
【问题描述】:

我有一个 WPF 应用程序,它使用一个名为 Visit 的业务对象,它有很多子对象,例如病人、检查等。有用于编辑这些各种子对象的视图和视图模型,因此有用于编辑患者信息的视图和视图模型以及用于检查信息等的集合。还有一个主窗口视图模型。

当我需要打开一个新的访问时,我有一个搜索屏幕,它也有它自己的视图模型。它需要从数据库中打开新的访问,并通知所有其他视图该访问发生了变化。

我研究了 WeakEventManager,并且还有一个视图模型是所有其他视图模型的父视图,但我不确定什么是最好的方法。我想知道视图模型之间的关系应该是什么,以及打开/搜索视图模型应该如何告诉所有其他视图进行更新。当属性更新时,我一直在我的视图模型中调用 OnPropertyChanged("propname"),但是由于其他视图不知道打开/搜索视图模型,所以他们不在乎我是否说 OnPropertyChanged("Visit" )

【问题讨论】:

    标签: wpf mvvm viewmodel


    【解决方案1】:

    看看这个关于Messengerpost on SO。在您的情况下,您发布 Visit 对象并让 ViewModel 捕获该对象以进行显示。

    如果您有一个非常以数据为中心的视图,其中 Model 数据几乎直接显示在 View 上而无需进行大量修改,您可以轻松地将 Model 公开为 ViewModel 上的属性并拥有View 绑定到它的属性。

    这样,当一个View 更新Model 时,另一个View 将自动更新,而无需侦听Model 上的属性更改事件

    编辑:

    详细说明我的第二点:您可能需要也可能不需要,但如果您的Model 也实现了INotifyPropertyChanged,那么对该模型的任何更改都将自动传播到View

    如果您需要有 2 个带有 Visit 对象的 View,那么您可以将 Visit 属性直接绑定到 XAML 中

    public class ViewModel1 : ViewModelBase
    {
       public ViewModel1(IMessenger messenger)
       {
           messenger.Register<Visit>(this, (v) => CurrentVisit = v);
       }
    
       public Visit CurrentVisit
       {
          get { _visit; }
          set { _visit = value; RaiseNotifyPropertyChange("CurrentVisit"); }
       }
    }
    
    public class ViewModel2: ViewModelBase
    { 
       public ViewModel2(IMessenger messenger)
       {
           messenger.Register<Visit>(this, (v) => CurrentVisit = v);
       }
    
       public Visit CurrentVisit
       {
          get { _visit; }
          set { _visit = value; RaiseNotifyPropertyChange("CurrentVisit"); }
       }
    }
    
    public class CurrentVisit : INotifyPropertyChanged
    { ... }
    

    就像我说的,这仅适用于您需要相同的 Visit 对象共享 2 个或更多 ViewModels 并且 View 主要以数据为中心,或者换句话说,来自 @987654339 的数据@ 直接显示在屏幕上。这是为了避免重复ViewModels 中的属性,并且必须一直引发属性更改事件。

    【讨论】:

    • 我同意这一点。如果您有许多需要相互通知的断开连接的 ViewModel,那么 MesageBus 方法会很有帮助。
    • 谢谢,请您详细说明一下:“这样,当一个视图更新模型时,另一个视图将自动更新,而无需侦听模型上的属性更改事件”——这是怎么回事准确的工作,你能给我一个例子或详细说明一下吗?
    • 因此,如果我在 viewModel 中有一个名为 CurrentVisit 的属性,并且我更改了该属性如何在所有视图中自动更新,我是否还需要调用 OnPropertyChanged?对不起,我不明白。
    • 刚刚更新了您的问题。您的情况可能需要也可能不需要。
    【解决方案2】:

    使用全局变量。只需在基础 ViewModel 类中使用属​​性,其设置部分设置全局变量并获取部分返回该变量值...用于设置该全局变量在其他常见项目中创建一个类并创建一个静态公共变量或属性。

    【讨论】:

    • 对不起,我的意思是你的视图模型类的基础
    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多