C# WPF MVVM 更符合模式理念的关闭View Window(窗口)方法

2021-02-19 08:16

阅读:603

因为很简单,博客就不多写了,下载项目看下代码相信你就能理解

既然要前后台分离,就不应该在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 窗口状态
        /// 
        /// 窗口状态(可绑定属性)为1时关闭
        /// 
        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();
        }
    }
}

搞定~

项目下载:

点我下载


评论


亲,登录后才可以留言!