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的后台代码中,注册IsEnableChange事件,在这个事件里,检测到传过来的值满足某个条件,即可触发Close()命令

如此,VM控制自己那个属性就能达到关闭V的目的了。

没代码我说个J8:

UI

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ……
    IsEnabled="{Binding IsLoginFailed, Mode=OneWay}">  

UI后台代码

public LoginWindow()
{
    InitializeComponent();  

    this.IsEnabledChanged += LoginWindow_IsEnabledChanged;
}
private void LoginWindow_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((bool)e.NewValue == false)
    {
        this.Close();
    }
}  

VM

private bool isLoginFailed = true;
/// <summary>
/// <para>获取或设置一个表示是否登录失败的值;true表示登录失败,否则为false。</para>
/// <para>与LoginWindow的IsEnable属性绑定。当为False时,关闭Login Window。</para>
/// 当该属性更改时通知客户端。
/// </summary>
public bool IsLoginFailed
{
    get
    {
        return this.isLoginFailed;
    }  

    set
    {
        if (this.isLoginFailed != value)
        {
            this.isLoginFailed = value;
            this.RaisePropertyChanged("IsLoginFailed");
        }
    }
}  

方案二、用Invoke

1、UI后台代码:

public LoginWindow()
{
    InitializeComponent();  

    this.DataContext = new LoginWindowVM(this.Close);
}  

2、VM代码:

Action _closeAction;
public LoginWindowVM(Action closeAction)
{
    InitializeLoginInfo();
    this._closeAction = closeAction;
}
void CloseWin()
{
    App.Current.Dispatcher.Invoke((Action)(() =>
    {
        this._closeAction.Invoke();
    }));
}  

两种方法,无疑第一种比较符合MVVM的思想。VM发出关闭的信号,触发V进行关闭,如何关闭,何时关闭,都由V自己控制;

而方案二,通过调用的方式来直接进行关闭,好像有点越俎代庖?

但是,IsEnable本意是用来控制失效和使能的,却被用于关闭UI,反而失去了控制失效使能的作用,有时会不方便。

时间: 2024-10-11 06:03:27

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

WPF:MVVM模式下ViewModel关闭View

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

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行

WPF MVVM模式下动画的实现

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

js架构设计模式——MVVM模式下,ViewModel和View,Model有什么区别

MVVM模式下,ViewModel和View,Model有什么区别 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工作无非就是从数据存储中读出数据,展现到用户界面上,然后从用户界面接收输入,写入到数据存储里面去.所以,对于数据 存储(model)和界面(view)这两层,大家基本没什么异议.但是,如何把model展现到view上,以及如何把数据从view写入到m

WPF MVVM 如何在ViewModel中操作View中的控件事件

(在学习Wpf的时候,做一个小例子,想在TextBox改变后,检验合法性,并弹出提示.在找了很多贴后,发现这个小例子,抄袭过来,仅供参考.) 虽然说MVVM模式下不建议在Viewmodel层中操控View层中控件,但是在某些情况下,比如想要得到某个事件的参数,在Viewmodel层中不太方便实现,这时候就可以用下面的方法了. 在XAML中 1.引用组件并设置 xmlns:Interaction="http://schemas.microsoft.com/expression/2010/inter

《Head First 设计模式》学习笔记——模板方法模式

模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 设计模式 模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤. 模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现.这样可以确

MVVM模式下如何使用ReactiveCocoa响应链式编程&lt;一&gt;

前一阵子公司要求项目从新架构,但又只给不到一个月的时间,这显然是不可能的.但从新架构又是在所难免的,和同事商定后决定一部分交互逻辑比较少的界面先使用MVVM架构,然后慢慢修改.下面整理了一下这次重构的遇到的问题,并希望能给大家一些帮助. 1.ReactiveCocoa的使用 要使用MVVM模式编程收下选择一个框架,当然不仅仅是ReactiveCocoa这一个框架,这里就不多说.当然我也没用过别的,如果哪位看官用过可以多多指教.接下来我就按步骤说了: 第一步:导入ReactiveCocoa框架,建

MVVM模式下的OpenFileDialog

对于MVVM模式下的ViewModel层来说,是不应该直接访问OpenFileDialog或者FolderBrowserDialog的,否则VM会变得难以测试. 参考StackOverFlow,对ViewModel进行改造,使OpenFileDialog动作也可以测试. 首先实现接口IIOService public interface IIOService { string OpenFileDialog(string srcFilter = ""); IList<string&

WPF MVVM中在ViewModel中关闭或者打开Window

这篇博客将介绍在MVVM模式ViewModel中关闭和打开View的方法. 1. ViewModel中关闭View public class MainViewModel { public DelegateCommand<Window> CloseWindowCommand { get; private set; } public MainViewModel() { CloseWindowCommand = new DelegateCommand<Window>(CloseWindo

LVS学习笔记--DR模式部署

一.部署环境: 服务器版本:CentOS6.5(Finnal) 网络拓扑: 二.需求分析:调度服务器与网页服务器均在同一网段局域网环境,用户提交的请求会经过调度器的分配指定到网页服务器,同时保证服务高可用性(任意一台网站服务器宕机后调度器会剔除它直至服务器恢复至正常:主调度器宕机后从调度器会接管它直至其恢复正常.). 三.相关配置: 部署调度器LVS服务脚本: #!/bin/sh mkdir tools cd tools/ # yum install lrzsz # rz # ls wget h