我有两个都打开的窗口。我试图能够在一个窗口上单击一个按钮,并且应该关闭该窗口。我希望通过按钮命令和命令参数来完成此操作。 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,但我现在只是想使此代码正常工作。
答案 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();
[....]
}