因为很简单,博客就不多写了,下载项目看下代码相信你就能理解。
既然要前后台分离,就不应该在ViewModel中直接操作View Window,我们可以用数据绑定的方法去操作它,给窗口绑定一个状态属性,为1时关闭窗口。
在开发过程中我们不可能每个窗口后台都手动加上这个属性,所以新建一个类,继承Window,在这个类添加一个依赖属性,用于判断窗口是否应该关闭,然后所有窗口只要使用这个类即可。
(普通属性不能绑定,需要依赖属性才行)
TmdWindow.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; namespace tmdmvvm { public class TmdWindow : Window { #region 依赖属性 #region 窗口状态 /// <summary> /// 窗口状态(可绑定属性)为1时关闭 /// </summary> public int WState { get { return (int)GetValue(WStateProperty); } set { SetValue(WStateProperty, value); } } public static readonly DependencyProperty WStateProperty = DependencyProperty.Register("WState", typeof(int), typeof(TmdWindow), new PropertyMetadata(defaultValue: 0, propertyChangedCallback: WStatePropertyChangedCallback, coerceValueCallback: null) ); private static void WStatePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { TmdWindow c = (d as TmdWindow); if (c != null) { if (e.NewValue != null) { int v = Convert.ToInt32(e.NewValue); switch (v) { case 1: //关闭窗口 c.Close(); break; } } } } #endregion #endregion } }
在window上使用和绑定状态属性
<local:TmdWindow x:Class="tmdmvvm.MainWindow" 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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:tmdmvvm" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" WState="{Binding WState}" > <TextBlock Text="这个窗口将在3秒后关闭"></TextBlock> </local:TmdWindow>
这里赶时间省略了很多代码,窗口关闭直接用一个线程延迟3秒去设置状态属性了,viewmodel的代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace tmdmvvm.ViewModel { public class TmdViewModel : UINotifyPropertyChanged { private int WState_; public int WState { get { return WState_; } set { WState_ = value; OnPropertyChanged(); } } public TmdViewModel() { Thread t = new Thread(() => { //睡眠3秒 Thread.Sleep(3000); //关闭窗口 WState = 1; }); t.Start(); } } }
搞定~
项目下载: