RelayCommand用于其他窗口中的按钮

时间:2011-01-25 02:25:10

标签: wpf button relaycommand

我有一个主窗口,还有一个名为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");
}

此代码执行良好,单击“确定”按钮时出现了MessageBox .. 但是当我点击确定按钮时如何关闭LoginWindow ...

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

修改

第一种方式,MVVM风格

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

    var window = new MyDialogWindow();

    window.DataContext = loginViewModel;

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

  3. 第二种方式,将窗口传递为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();
    }
    

    另见: Button的属性IsDefaultIsCancel