WPF MVVM: How to close a window

.net, c#, mvvm, wpf, xaml

Solution

I just completed a blog post on this very topic. In a nutshell, add an `Action` property to your ViewModel with `get` and `set` accessors. Then define the `Action` from your `View` constructor. Finally, invoke your action in the bound command that should close the window.

In the ViewModel:

public Action CloseAction  { get; set;}

and in the `View` constructor:

private View()
{
    InitializeComponent();
    ViewModel vm = new ViewModel();
    this.DataContext = vm;
    if ( vm.CloseAction == null )
        vm.CloseAction = new Action(this.Close);
}

Finally, in whatever bound command that should close the window, we can simply invoke

CloseAction(); // Calls Close() method of the View

This worked for me, seemed like a fairly elegant solution, and saved me a bunch of coding.

Problem

I have a `Button` that closes my window when it's clicked: ``` <Button x:Name="buttonOk" IsCancel="True">Ok</Button> ``` That's fine until I add a `Command` to the `Button` i.e. ``` <Button x:Name="buttonOk" Command="{Binding SaveCommand}" IsCancel="True">Ok</Button> ``` Now it doesn't close presumably because I am handling the `Command`. I can fix this by putting an `EventHandler` in and calling `this.Close()` i.e. ``` <Button x:Name="buttonOk" Click="closeWindow" Command="{Binding SaveCommand}" IsCancel="True">Ok</Button> ``` but now I have code in my code behind i.e. the method `SaveCommand`. I am using the MVVM pattern and `SaveCommand` is the only code in my code behind. How can I do this differently so as not to use code behind?

Original source

Related problems