C# WPF关闭来自ViewModel类的MVVM窗口

C# WPF关闭来自ViewModel类的MVVM窗口,c#,wpf,mvvm,C#,Wpf,Mvvm,我认为: <Button Grid.Column="2" x:Name="BackBtn" Content="Powrót" Command="{Binding ClickCommand}" Width="100" Margin="10" HorizontalAlignment="Right"/> 我不知道如何处理该问题,我想从ViewModel关闭当前窗口,因为我正在打开一个新窗口。您可以将窗口设计为接收用于发出关闭请求信号的上下文对象 public interface IClo

我认为:

<Button Grid.Column="2" x:Name="BackBtn" Content="Powrót" Command="{Binding ClickCommand}" Width="100" Margin="10" HorizontalAlignment="Right"/>

我不知道如何处理该问题,我想从ViewModel关闭当前窗口,因为我正在打开一个新窗口。

您可以将窗口设计为接收用于发出关闭请求信号的上下文对象

public interface ICloseable
{
    event EventHandler CloseRequest;
}

public class WindowViewModel : BaseViewModel, ICloseable
{
    public event EventHandler CloseRequest;
    protected void RaiseCloseRequest()
    {
        var handler = CloseRequest;
        if (handler != null) handler(this, EventArgs.Empty);
    }
}


public partial class MainWindow : Window
{
    public MainWindow(ICloseable context)
    {
        InitializeComponent();
        context.CloseRequest += (s, e) => this.Close();
    }
}

这在这些论坛上已经被回答了很多次


在我看来,最干净的解决方案是一个附加属性,如顶级答案中所述。

您是说要调用
Application.Current.MainWindow.Close()在打开新窗口之前?只是一个旁注——说一些“不起作用”是没有用的。这可能意味着什么。您试图调用Close()(在哪个对象上?)但它“不起作用”:它是否抛出异常?编译器有没有告诉你它不是你试图调用的神秘未知对象的成员?还是怎样事情可能在很多方面“不起作用”。比如说哪个。不工作意味着什么都没有发生。CommandHandler类是如何实现的?这对您来说可能也很有趣:我相信有更简单的解决方案that@mike_pl你想把你的代码和你的用户界面分离开来,这样他们就不认识了(MVVM)。。。这是一个非常简洁的解决方案…为什么公共主窗口(ICloseable上下文){InitializeComponent();context.CloseRequest+=(s,e)=>this.Close();}它没有非参数构造函数??现在我不能在其他地方创建这个窗口,我应该用什么来创建那个主窗口?这是我的代码,如果可以的话,请让它工作起来:/n现在我不能在其他地方创建MainWindow()的这个对象,因为我不知道要将什么作为参数传递给它的构造函数。。。
public interface ICloseable
{
    event EventHandler CloseRequest;
}

public class WindowViewModel : BaseViewModel, ICloseable
{
    public event EventHandler CloseRequest;
    protected void RaiseCloseRequest()
    {
        var handler = CloseRequest;
        if (handler != null) handler(this, EventArgs.Empty);
    }
}


public partial class MainWindow : Window
{
    public MainWindow(ICloseable context)
    {
        InitializeComponent();
        context.CloseRequest += (s, e) => this.Close();
    }
}