在wpf中将参数从一个视图模型传递到另一个视图模型

时间:2014-10-28 14:07:11

标签: wpf vb.net mvvm

当我继续适应wpf和mvvm的新世界时,我发现自己遇到了另一个问题,这个问题有点令人烦恼。

在Windows窗体中,如果我需要一个新表单来获取参数,我只需将我需要的信息传递给该表单的构造函数。因为Winforms本质上是模型背后的代码,所以这不是一个问题。

我现在发现自己有一个MainWindow(由MainWindowViewModel控制)和一个Login(由LoginViewModel控制),它首先显示为对话框。我已经排除了缺少对话框结果的问题,我可以在关闭登录对话框后显示主窗口。

显示登录对话框,并在应用程序启动时使用以下代码进行响应;

dim dlg As New Login

    If dlg.ShowDialog() = True Then

    Else
       Current.Shutdown(0)
    End If

我在登录窗口后面的代码中使用以下内容,以便在登录对话框关闭时显示主窗口;

Public Sub New

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
   Application.Current.ShutdownMode =ShutdownMode.OnExplicitShutdown
End Sub

Protected Overrides Sub OnClosed(e As EventArgs)
MyBase.OnClosed(e)
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose
End Sub

现在Mainwindow已经知道它的datacontext是MainWindoViewModel,因为我在设计混合时设置了它,所以我如何传递我想从LoginViewModel传递给MainWindowViewModel的任何参数?

我可以阅读c#但如果可能的话更喜欢vb。我知道这是我想要经常做的事情,所以如果有一个通用的方法来做到这一点,那就是我想去的方式。

由于

1 个答案:

答案 0 :(得分:0)

Mvvm框架通常实现某种消息传递系统,以允许数据在视图模型之间移动,或者有时在视图模型和视图之间移动。

您可以在一些更流行的框架(如MvvmLight或MvvmCross)中查看消息传递的处理方式。它通常就像一个使用弱引用来阻止紧耦合的事件,因此您可以注册一种消息,然后从另一个视图模型中向任何已注册的侦听器发布消息。

因此,您需要实现自己的信使,或者现在可能需要考虑开始使用第三方框架,除非您有特定的理由避免这种情况。