C#使用MVVM - 困难行为

时间:2016-05-02 16:53:06

标签: c# wpf mvvm navigation

在花费数小时(可能是几天)努力解决之后,我决定相信你的知识。我想实现这种行为(蓝色):enter image description here

所以在 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
  }

2 个答案:

答案 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包含ShowShowDialog等方法,您可以将任何ViewModel传递给它们。然后,这些方法将打开已注册的视图,并为新创建的ViewModel分配新的UIService。

我在this answer中详细描述了这个过程。