如何在 WPF MVVM 应用程序中成功登录关闭 LoginView?

Posted

技术标签:

【中文标题】如何在 WPF MVVM 应用程序中成功登录关闭 LoginView?【英文标题】:how to make successful login close LoginView in WPF MVVM application? 【发布时间】:2012-07-11 21:19:54 【问题描述】:

我在 MVVM 架构中有一个 WPF 应用程序。 当应用程序加载时,我需要显示一个“登录”窗口,用户可以在其中输入用户名和密码。

然后将其传递给 ServiceLocator,后者会创建一个连接到 WCF 服务的客户端。

问题:

如何在客户端成功连接后关闭“登录”窗口,而不使用 View 的 '.cs' 文件中的任何代码隐藏?

【问题讨论】:

隐藏主窗口。登录成功时显示。登录窗口应该像 MVVM 中的任何其他对话框一样处理。 【参考方案1】:

我通常在 IDialogService 实现中向 ViewModel 传递一个关闭操作。

public void ShowDialog(IDialogViewModel vm)

    // create the dialog view
    ...
    vm.CloseAction = () => dialog.Close();
    dialog.DataContext = vm;
    ...
    // show the dialog 
    dialog.ShowDialog();

【讨论】:

【参考方案2】:

您可以覆盖 Application 类的 OnStartup 方法,您可以在其中将登录屏幕作为对话框打开,一旦用户输入有效数据,您就可以返回布尔值,在登录屏幕关闭时,您可以根据布尔值做进一步的逻辑价值。

【讨论】:

【参考方案3】:

我使用dialogservice 登录并公开一个事件

event EventHandler<RequestCloseEventArgs> RequestCloseDialog;

当客户端成功登录时关闭对话框。

编辑:这是一个例子

在你的app.xaml.cs

protected override void OnStartup(StartupEventArgs e)

    var result = this._dialogService.Show("Login",this._myloginviewmodel);

    // When use click cancel in the login dialog
    if(!result)
     
        // Close app or whatever
    

    // Access the properties of myloginviewmodel if you want

    // Now the only part of my app where I use view-first instead of viewmodel-first
    this.MainWindow = new MainWindow(_mainwindowviwemodel);
    this.MainWindow.Show();

这一切都在我的OnStartup() 中,是的,这就是我的app.xaml 的代码隐藏,但这是我的应用程序根目录,这就是为什么这对我来说没问题。我没有 AppViewModel 或类似的东西,因为app.xaml 永远不会“显示”给用户。

【讨论】:

如何在“OnStartup”中使用它?你能发布一个代码示例吗? 就像@pchajer 说的那样:这不违反 MVVM,因为逻辑是用违反 MVVM 的代码编写的吗? 不,因为我没有引用视图的视图模型。而 app.xaml.cs 对我来说不是“查看代码隐藏”——它是我的应用程序根目录。

以上是关于如何在 WPF MVVM 应用程序中成功登录关闭 LoginView?的主要内容,如果未能解决你的问题,请参考以下文章

wpf mvvm ViewModel如何关闭view窗口

WPF的MVVM模式

我在哪里将登录逻辑放在WPF中,如何在MVVM中处理它?

如何在 MVVM-WPF 中获取所选项目

如何使用 MVVM 模式“禁用”WPF 中的按钮?

WPF MVVM从入门到精通7:关闭窗口和打开新窗口