通过ViewModel关闭窗口

时间:2016-08-19 04:57:01

标签: c# wpf xaml mvvm

我有一个登录窗口,出现在以下场景中:

  • 应用程序启动:如果用户尚未登录(存储在Properties.Setting中的客户端ID),则会显示登录窗口。用户登录,登录窗口关闭,主程序成功打开。
  • 用户已登录,但现在想以其他用户身份登录:用户按下登录按钮,出现登录窗口,用户登录。成功后,登录窗口关闭,新用户的信息显示在一个小文本框中。

这里的问题是我想在两种情况下使用相同的登录窗口。我想象的是每个这些场景的自定义回调方法,这些方法将在登录成功时调用。我正面临通过我的LogonViewModel访问LogonWindow的问题,其中登录的逻辑发生了。这样做的原因是我想在成功时关闭窗口并做其他事情。

这是我的代码:

App.xaml.cs

private void check()
{
    if (isloggedin)
    {
        Client c = new Client();
        Main m = new Main(c);
        m.Show(); //
    }
    else
    {
        LoginViewModel vm = new LoginViewModel();
        vm.callback = (loginViewModel, client) =>
        {
            // the user logged in, now show the window and close the login window
            Main m = new Main(client);
            m.Show();

            // close LoginWindow after we're done logging in. 
            // But where? Who has access to window?
        };
        LoginWindow lw = new LoginWindow(vm);
        lw.Show();
    }
}

LoginViewModel.cs

public class LoginViewModel : ViewModelBase
{
    public Action<LoginViewModel, Client> callback { get; set; }

    public LoginViewModel()
    {
    }

    public ICommand SignIn
    {
        get
        {
            return new RelayCommand<object>(signin, o => canLogin());
        }
    }

    private bool canLogin()
    {
        return true;
    }

    private void signin(object o)
    {
        if (clogin.login())
        {
            Console.WriteLine("Client Found!");
            Client client = clogin.getClient();
            // save settings
            Properties.Settings.Default.clientid = client.Uid;
            Properties.Settings.Default.Save();
            Client = client;
            // pass the new client, and pass the current view model?

            callback(this, client);
        }
    }
}

最初的想法是将整个窗口对象传递给viewmodel,但我认为这打破了MVVM的本质,并且能够从我的回调方法中关闭窗口,因为我已经传入LoginViewModel。我的问题是,有没有办法实现我想要做的事情?请记住,根据我的应用程序中的哪一点,用户已成功登录后,本质上是做某事......感谢您的投入。

1 个答案:

答案 0 :(得分:0)

在你的情况下,我会向我的ViewModel添加两个事件

public event Action<Client> SignInSucceded;
public event Action CloseApplication;

创建Viewmodel时,您可以将要执行的操作绑定到事件中。

例如,您可以创建主窗口并显示它或抓取现有窗口并显示它。

与近场通话相同的程序。只需绑定一个对所有不需要的视图和组件执行关闭的方法。

因为当你将viewmodel绑定到这个事件时,你有一个有效的实例,绑定它应该没有问题。我不知道你的客户端类是什么,但你可以在绑定到事件的方法中移动它的创建,并用uid调用事件。

编辑:

在你的App.xaml.cs中你保留了一个属性,它可以看到你的窗口的实例,然后你可以这样做:

viewModel.CloseApplication += () => this.mainWindow.Close();

注意同步(Dispatcher)

我希望我能正确理解你的意图。

相关问题