按钮命令不会关闭窗口

时间:2018-09-26 00:59:45

标签: c# wpf button

我有两个都打开的窗口。我试图能够在一个窗口上单击一个按钮,并且应该关闭该窗口。我希望通过按钮命令和命令参数来完成此操作。 execute方法在命令参数之间切换,以查找单击了哪个按钮,并应相应执行指定的任务,如下所示:

public void Execute(object parameter)
    {
        LoginPage loginPage = new LoginPage();
        CreateAccountPage createAccountPage = new CreateAccountPage();
        DepositPage depositPage = new DepositPage();
        WithdrawPage withdrawPage = new WithdrawPage();

        switch (parameter)
        {
            case "LoginPageButton":
                if (viewModel.IsLoggedIn == false)
                loginPage.Show();
                else if (viewModel.IsLoggedIn == true)
                        loginPage.Close();
                break;
            case "CreateAccountPageButton":
                createAccountPage.Show();
                break;
            case "DepositPageButton":
                depositPage.Show();
                break;
            case "WithdrawPageButton":
                withdrawPage.Show();
                break;
            case "ClearOrderButton":
                //code here
                break;
            case "LogoutButton":
                //code here
                break;
            case "FinishLoginButton": // this is where the issue is
                loginPage.Close();//this does not close the loginPage window
                break;
        }
     }

没有构建错误,该命令将执行其他任务,例如打开其他窗口等,但不会关闭该窗口,因此我知道代码已到达,该窗口不会关闭,经过几天的研究我没有能够找到答案。我可以通过单击按钮来执行所需的任务,如下所示:

private void FinishLogin_Click(object sender, RoutedEventArgs e)
    {
        if ((viewModel.usernameList.Contains(UsernameTextBox.Text) &&
           viewModel.passwordList.Contains(PasswordTextBox.Text)) &&
           (viewModel.usernameList.IndexOf(UsernameTextBox.Text) ==
           (viewModel.passwordList.IndexOf(PasswordTextBox.Text))))
        {
            viewModel.IsLoggedIn = true;
            this.Close();
        }
    }

以及将来需要执行的任务,但我不想使用按钮单击,并且将来需要更改inotifyproperty属性,因此需要命令。 这是需要单击以关闭窗口的按钮的代码:

<Button Content="Finish Login" Grid.Column="1" Grid.Row="2"     FontWeight="Bold" Margin="130 10 30 10" Background="Firebrick" Command="{Binding ButtonCommands}" CommandParameter="FinishLoginButton"/>

我知道很多此类代码不会遵循MVVM,但我现在只是想使此代码正常工作。

1 个答案:

答案 0 :(得分:1)

在此示例中,您创建一个新实例LoginPage loginPage = new LoginPage();,然后关闭该特定实例。您需要做的是传递窗口的现有实例并将其关闭。

在您的Window代码中(如果您是以这种方式设置viewmodel的话):

//Pass the current instance of the window to the viewmodel
this.DataContext = new LoginPage(this); 

然后,更新视图模型的构造函数以获取窗口实例

private Window _parent;
public LoginPage(Window Parent)
{
    _parent = Parent;
}

并更新您的Execute方法(删除new LoginPage()等)

public void Execute(object parameter)
{
    [....]
    _parent.Close();
    [....]
}