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

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

既然要前后台分离,就不应该在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();
        }
    }
}

搞定~

项目下载:

点我下载

原文地址:https://www.cnblogs.com/berumotto/p/8320192.html

时间: 2024-10-07 19:59:19

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

WPF:MVVM模式下ViewModel关闭View

不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnableChange事件,在这个事件里,检测到传过来的值满足某个条件,即可触发Close()命令 如此,VM控制自己那个属性就能达到关闭V的目的了. 二.参数传递. 根据参数传递的不同.分为传递函数和传递View对象. 1传递函数 该方法:需要三步. 1.重写ViewModel的构造函数 public P

WPF MVVM模式

1. MVVM MVVM的设计模式最早于2005年由微软的WPF和Silverlight架构师John Gossman在他的博客中提到. WPF中采用MVVM的架构可以获得以下好处: 1. 将UI和业务的设计完全分开,View只是ViewModel的消费者 2. 有助于我们区别并哪些是UI操作,哪些是业务操作,而不是将他们混淆 3.层与层之间耦合度降低,这一点非常符合面向对象(OOP)的思想. 2.MVVM 用图来表示,这个是从网上找的图,简单明了,省去了自己画.   3.下面来一步一步写代码吧

WPF学习笔记:MVVM模式下,ViewModel如何关闭View?

原文:http://blog.csdn.net/leftfist/article/details/32349731 矫枉过正,从一个极端走向另一个极端.MVVM模式,View只负责呈现,虽然也有后台代码,但基本上就是摆设,VM接管了一切的逻辑处理. 那么,现在,大能的VM已经完成了所有的事情,这个窗口V如何才能自动关闭呢? 据我目前少得可怜的WPF知识可知,有两种方案: 方案一.利用View里的IsEnable属性. 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台

WPF MVVM模式的一些理解

/*本文转自 http://www.cnblogs.com/sirkevin/archive/2012/11/28/2793471.html */ 使用WPF+Mvvm开发一年多,期间由于对Mvvm模式的理解不足,遇到了很多问题,也绕了很多弯子:网上提供的Mvvm的示例比较简单,实际项目中的需求也各种各样.不过经过几个项目,也有了一些对Mvvm模式的理解: 1. Mvvm是什么,Mvvm是怎么来的?Mvvm模式广泛应用在WPF项目开发中,使用此模式可以把UI和业务逻辑分离开,使UI设计人员和业务

Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器-比lombok更符合需求

builder模式在越来越多的项目中使用,类似于alibaba fastjson JSONObject.fluentPut(),调用一个方法后返回这个对象本身,特别适合构建一些参数超级多的对象,代码优雅且易读.构建一个对象变成了SomeObject some = new SomeObject().a("a").b("b").c("c").biuld();.ItellJ IDEA和Eclipse的generator只能生成传统的getter set

WPF MVVM从入门到精通1:MVVM模式简介

刚开始接触和使用MVVM模式的时候,就有一种感觉:哇,实现这么一丁点的功能,竟然要写这么多代码,太麻烦了吧!但是后来当我熟悉了这种模式之后,感觉就变成了:哇,还是这么麻烦. 没错,使用MVVM模式的确要在项目中增加很多代码.不过MVVM设计模式是有它的优点的,不然就不会存在.把界面和业务逻辑分离,这是MVVM的根本目的.WPF的依赖属性.数据绑定等机制,很好地帮助我们实现MVVM模式,基本可以做到在界面层不出现业务逻辑代码. 我们先来看一下MVVM模式的基本结构: View就是界面,可以理解为X

WPF MVVM模式下动画的实现

原文:WPF MVVM模式下动画的实现 在MVVM模式下,数据的显示都是通过绑定来实现的.当我们在ViewModel里修改数据时,View里面的界面会瞬间变化.但是如果我们希望这个变化有一个动画效果,应该怎么做呢? 可能一开始我们会想到DoubleAnimation.StoryBoard这些东西,但我们很快就会发现,它们只能操作View里面的元素,我们无法在ViewModel里使用它们. 我们在这里使用的方法是:创建一个类似DoubleAnimation的类,它的操作对象就是普通的double类

android中MVC,MVP和MVVM三种模式详解析

我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到了MVP模式,但是现在人们并没有总结出一种规范,所以MVP模式的写法并不统一,而至于MVVM模式看网上的呼声似乎也是赞同和拍砖的参半,所以对于这几种模式我也不发表意见了,适合自己的才是最好的.下面是我看到的关于这几种模式的几篇文章,整合了一下分享给大家. ----------------------

WPF MVVM初体验

首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑定的属性,操作逻辑构成:因为View与ViewModel进行了解耦,我们可以对ViewModel进行Unit Test: Models:可以是实体对象或者Web服务: 下面通过一个简单的例子,来介绍一些WPF MVVM模式.示例将展示一个图片浏览器,打开图片,放大/缩小图片大小.首先项目结构: UI