1

我有一个主窗口和另一个名为 Loginwindow 的窗口。在某些时候,此 LoginWindow 会显示以获取一些登录信息...在 LoginWindow 中,我有一个按钮,它的 Command 属性绑定到 MainViewModel 中的 OkCommand,如下所示:

<Button Content = "Ok" Command="{Binding OkCommand}"/>

在我的 MainVeiwModel 中,我添加了一个 OkCommand RelayCommand

public RelayCommand OkCommand
{
    get { return new RelayCommand(OkClose); }
}

private void OkClose()
{
    MessageBox.Show("Close Login");
}

这段代码执行得很好,当我点击 Ok 按钮时 MessageBox 已经出现。但是当我点击 Ok 按钮时如何关闭 LoginWindow ......

4

2 回答 2

1

我提出了非常简单的解决方案。不要绑定命令,只需在 LoginWindow 代码隐藏中处理 Clicked 事件。从那里关闭窗口真的很容易。

还有另一个原因,为什么你在不同窗口的VM中处理OK按钮?


在 XAML (window.xaml) 中:

<Button Content="OK" Click="button1_Click" />

在后面的代码(window.xaml.cs)中:

private void button1_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}
于 2011-01-25T02:49:33.113 回答
0

编辑:

第一种方式,MVVM 风格

  1. 将事件 RequestClose 添加到您的 VM。并在 OkCommand 执行时引发此事件。
  2. 在您显示对话框并将 VM 绑定到窗口的位置,还要向该事件添加处理程序,例如:

    var window = new MyDialogWindow();

    window.DataContext = loginViewModel;

    loginViewModel.RequestClose += (s, e) =>window.Close();

第二种方式,将 window 作为CommandParameter传递:

为您的窗口设置名称属性:

<Button Content = "Ok" Command="{Binding OkCommand}" 
CommandParameter="{Binding ElementName=_windowName}"/>

或者

<Button Content = "Ok" Command="{Binding OkCommand}" 
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>

并在命令执行中关闭窗口:

public void Execute(object parameter)
{
    var wnd = parameter as Window;
    if (wnd!= null)
        wnd.Close();
}

另请参阅:按钮的属性IsDefaultIsCancel

于 2011-01-25T02:29:47.343 回答