wpf 在mvvm模式下通過命令關閉子窗體
阿新 • • 發佈:2019-02-06
我們知道通過註冊事件直接可以在後臺用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 對應的命令方法如下: