Window.Close() from XAML
July 1, 2009
It’s been a long time since I last posted. Since then I have been working on my first WPF contract. I have definately drank the cool aid, I love WPF (when MVVM is being used anyway).
One thing I haven’t been able to find any info on is how to close a window or dialog from XAML. I tried and tried and then gave up. Until now!
Having discovered the power of Attached Behaviours, I decided to write one that would close a window. All you need do then is create a data trigger that watches a CloseSignal on the ViewModel and sets the Close property to true.
public static class WindowCloseBehaviour
{
public static void SetClose(DependencyObject target, bool value)
{
target.SetValue(CloseProperty, value);
}
public static readonly DependencyProperty CloseProperty =
DependencyProperty.RegisterAttached(
"Close",
typeof(bool),
typeof(WindowCloseBehaviour),
new UIPropertyMetadata(false, OnClose));
private static void OnClose(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue is bool && ((bool)e.NewValue))
{
Window window = GetWindow(sender);
if (window != null)
window.Close();
}
}
private static Window GetWindow(DependencyObject sender)
{
Window window = null;
if (sender is Window)
window = (Window)sender;
if (window == null)
window = Window.GetWindow(sender);
return window;
}
}
and then in your XAML
<Style.Triggers>
<DataTrigger Binding="{Binding CloseSignal}" Value="true">
<Setter Property="Behaviours:WindowCloseBehaviour.Close" Value="true" />
</DataTrigger>
</Style>

September 28, 2009 at 5:21 pm
Thanks, I got it working with a bit of googling.
In VS2008 the compiler picked up a few errors with the code…
Namely, I had to change the GetClose method to return a bool and not be a void.
Also, for those that are noobs to WPF like me
is an example of how to set the Attached behaviour.
Thanks a ton though, I think this is the most elegant way I have found so far!
October 29, 2009 at 11:26 am
Hey Mark,
Can you please share of a complete sample what all changes you made to this. I need it badly.
Thanks in advance
October 29, 2009 at 12:36 pm
I solved that myself.
November 25, 2009 at 2:50 am
Me = newb.
I am getting an error “Cannot convert the value in attribute ‘Property’ to object of type ‘System.Windows.DependencyProperty’.” and am uncertain how to resolve it. Any guidance is appreciated.
January 20, 2010 at 5:14 am
I struggled with this code. the only way I could make it work is by removing ‘readonly’ from CloseProperty. Hope it helps. No other changes were necessary.
July 26, 2010 at 1:05 am
[...] it, despite perfectly answering the question — pointed to a blog post by Adam Mills: “Window.Close() from XAML”. Adam’s solution uses an attached behavior. I’m learning to appreciate the [...]
February 16, 2011 at 11:50 pm
[...] I have posted previously about one way to Close a Dialog from a ViewModel [...]
June 21, 2011 at 9:52 pm
slight syntax error in your code sample above – the xaml should read
, not . thanks for this, very helpful.
June 21, 2011 at 9:53 pm
well that didn’t post correctly… what i meant to say was:
</Style.Triggers>, not </Style>