我有一个登录窗口,出现在以下场景中:
这里的问题是我想在两种情况下使用相同的登录窗口。我想象的是每个这些场景的自定义回调方法,这些方法将在登录成功时调用。我正面临通过我的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
。我的问题是,有没有办法实现我想要做的事情?请记住,根据我的应用程序中的哪一点,用户已成功登录后,本质上是做某事......感谢您的投入。
答案 0 :(得分:0)
在你的情况下,我会向我的ViewModel添加两个事件
public event Action<Client> SignInSucceded;
public event Action CloseApplication;
创建Viewmodel时,您可以将要执行的操作绑定到事件中。
例如,您可以创建主窗口并显示它或抓取现有窗口并显示它。
与近场通话相同的程序。只需绑定一个对所有不需要的视图和组件执行关闭的方法。
因为当你将viewmodel绑定到这个事件时,你有一个有效的实例,绑定它应该没有问题。我不知道你的客户端类是什么,但你可以在绑定到事件的方法中移动它的创建,并用uid调用事件。
在你的App.xaml.cs中你保留了一个属性,它可以看到你的窗口的实例,然后你可以这样做:
viewModel.CloseApplication += () => this.mainWindow.Close();
注意同步(Dispatcher)
我希望我能正确理解你的意图。