wpf 在mvvm模式下通过命令关闭子窗体

我们知道通过注册事件直接可以在后台用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 对应的命令方法如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值