在花费数小时(也许数天)努力解决问题后,我决定相信您的知识。我想实现这个行为(蓝色):
因此,在 loginButton 中,我触发了一个在 loginViewModel 中处理的命令,在此处理程序中,我对网络服务进行了一些验证,并使用该答案我想打开一个发送用户(类)的新窗口。我怎样才能做到这一点?
我试过消息传递,我试过很多东西。在代码隐藏中,我想使用 MVVM 架构来做这样的事情。
LoginView 代码隐藏
button_OnClick(){
// Checking stuff
var u = //from the server;
PrincipalView pv = new PrincipalView(u);
pv.Show();
this.Close()
}
在 PrincipalView 代码隐藏中:
public PrincipalView(User u){
// Yey, I have the user
}
我已经通过使用自定义窗口服务类来完成此操作,如下所示:
class WindowsService
{
private static LoginWindow loginWindow{ get; set; }
private static UserWindow UserWindow{ get; set; }
public void ShowLoginWindow(LoginViewModel loginViewModel)
{
LoginWindow = new LoginWindow
{
DataContext = loginViewModel
};
LoginWindow.Show();
}
public void ShowUserWindow(UserViewModel userViewModel)
{
UserWindow = new UserWindow
{
DataContext = userViewModel
};
LoginWindow .Hide();
UserWindow.Show();
}
}
因此,您在 LoginViewModel 中声明了一个 WindowsService 实例,当您的逻辑找到用户时,您就创建了一个 UserViewModel 实例,并且调用 windowsService.ShowUserWindow(userViewModel)。为了正确使用它,您必须像这样修改您的 App.xaml.cs 文件:
public partial class App : Application
{
private void App_OnStartup(object sender, StartupEventArgs e)
{
var loginViewModel = new LoginViewModel();
loginViewModel.StartLoginWindowService();
}
}
StartLoginWindowService() 方法可能如下所示:
public void StartLoginWindowService()
{
WindowsService.ShowLoginWindow(this);
}
如果有帮助,请告诉我
解释在何处创建 UserWindowViemodel
假设您的 loginViewmodel 中有以下方法
public void Loging(string name, string pass){
var isAllowed(name, pass); //Check if user exists and if pass is correct
if(!isAllowed) return; //we return if user is invalid
var wService = new WindowsService();
var myUser = new UserWindowViewModel(name){
//you set all proeperties you need here
}
wService.ShowUserWindow(myUser);
}