1. 程式人生 > >wpf 在mvvm模式下通過命令關閉子窗體

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 對應的命令方法如下: