Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在wpf中将参数从一个视图模型传递到另一个视图模型_Wpf_Vb.net_Mvvm - Fatal编程技术网

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

在wpf中将参数从一个视图模型传递到另一个视图模型,wpf,vb.net,mvvm,Wpf,Vb.net,Mvvm,当我继续适应wpf和mvvm的新世界时,我发现自己遇到了另一个问题,这证明有点令人烦恼 在windows窗体中,如果我需要一个新窗体来获取参数,我只需将所需的信息传递给该窗体的构造函数。因为Winforms本质上是一个代码隐藏模型,所以这不是问题 我现在发现自己有一个由MainWindowViewModel控制的MainWindow和一个由LoginViewModel控制的登录名,它首先显示为一个对话框。我已经对缺少对话框结果的问题进行了排序,我可以在关闭登录对话框后显示主窗口 在应用程序启动时

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

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

我现在发现自己有一个由MainWindowViewModel控制的MainWindow和一个由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,因为我在使用blend设计它时设置了它,那么我如何将我想要传递的任何参数从LoginViewModel传递到MainWindowViewModel

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


多亏了Mvvm框架通常会实现某种消息传递系统,以允许数据在viewmodels之间移动,或者有时在viewmodel和view之间移动

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


因此,您可能需要实现您自己的messenger,或者现在可能是开始使用第三方框架的时候,除非您有特定的理由避免这样做。

通常您会使用某种消息系统在不相关的ViewModels之间传递数据,但是,在您使用登录和主视图模型的情况下,在登录成功之前,我不会创建主视图模型,我会在构造函数中传递它所需的数据。如果你感兴趣,我举个例子。