我们知道通过注册事件直接可以在后台用this.Close();方法进行直接关闭窗体。但是当我们用了mvvm 模式后,代码的分层和规范让我们不好再用传统的方式进行关闭窗口,那么在mvvm 下我们如何通过命令的方式下关闭窗口呢?
利用View里的IsEnable属性。
在子窗体的属性中使用 IsEnable . 如下:
<Window x:Class="wpfYourSystem.Views.SettingParameter"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCore"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpfYourSystem.Views"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
mc:Ignorable="d" Name="frmSetting"
IsEnabled="{Binding IsCloseWin,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Background="Transparent" AllowsTransparency="True" WindowStartupLocation="CenterScreen" >
在子窗体的xml.cs文件下编写如下代码:
子窗体的构造函数添加注册事件
///子窗体构造函数
public SettingParameter()
{
InitializeComponent();
this.DataContext = new SettingViewModel();
this.IsEnabledChanged += SettingWindow_IsEnabledChanged;
}
/// <summary>
/// 关闭子窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SettingWindow_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if ((bool)e.NewValue == false)
{
Grid grid = this.Owner.Content as Grid;
//父级窗体原来的内容
UIElement original = VisualTreeHelper.GetChild(grid, 0) as UIElement;
//将父级窗体原来的内容在容器Grid中移除
grid.Children.Remove(original);
//赋给父级窗体
this.Owner.Content = original;
this.Close();
}
}
settingviewmodel 中 的属性如下:
private bool isCloseWin = true;
/// <summary>
/// <para>与view的IsEnable属性绑定。当为False时,关闭view。</para>
/// 当该属性更改时通知客户端。
/// </summary>
public bool IsCloseWin
{
get
{
return isCloseWin;
}
set
{
this.SetProperty(ref isCloseWin, value);
}
}
前台view 对应的关闭按钮如下:
<Button Name="btnClose" Command="{Binding BtnCloseCommand}" CommandParameter="{Binding ElementName=frmSetting}" Style="{DynamicResource toolsclose}" RenderTransformOrigin="0.5,0.5" Margin="5 0 5 0"/>
settingviewmodel 对应的命令方法如下: