在花费数小时(可能是几天)努力解决之后,我决定相信你的知识。我想实现这种行为(蓝色):
所以在 loginButton 中我触发了一个在此处理程序中 loginViewModel 处理的命令,我对Web服务进行了一些验证并使用该答案我要打开一个发送用户(类)的新窗口。我怎样才能做到这一点?
我尝试过短信,我尝试过很多东西。在代码背后是我想用MVVM架构做的事情。
LoginView代码隐藏
button_OnClick(){
// Checking stuff
var u = //from the server;
PrincipalView pv = new PrincipalView(u);
pv.Show();
this.Close()
}
在 PrincipalView Code-Behind :
中public PrincipalView(User u){
// Yey, I have the user
}
答案 0 :(得分:1)
我通过使用如下的自定义窗口服务类来完成此操作:
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);
}
答案 1 :(得分:0)
您可能需要一个服务,当您将ViewModel传递给它时会打开一个窗口。
基本上,当你给它一个ViewModel时,你会有ViewLocator
找到指定的View。 UIService
包含Show
和ShowDialog
等方法,您可以将任何ViewModel传递给它们。然后,这些方法将打开已注册的视图,并为新创建的ViewModel分配新的UIService。
我在this answer中详细描述了这个过程。