原文: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,反而失去了控制失效使能的作用,有时会不方便。

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

  1. WPF实战案例-MVVM模式下在Xaml中弹出窗体

    相信很多学习和开发wpf项目的同学都了解过mvvm模式,同样,在mvvm模式下会有一个不可忽视的问题,就是怎么在xaml中弹出窗体,而不破坏MVVM本身的结构. 关于弹出窗体的方式还是很多的,本文先讲 ...

  2. WPF中在MVVM模式下,后台绑定ListCollectionView事件触发问题

    问题:WPF中MVVM模式下 ListView绑定ListCollectionView时,CurrentChanged无法触发 解决方案: 初期方案:利用ListView的SelectionChang ...

  3. WPF:MVVM模式下ViewModel关闭View

    不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnabl ...

  4. WPF:MVVM模式下ViewModel调用View

    两种基本方法: 消息通知和参数传递 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnableCha ...

  5. WPF实战案例-MVVM模式下用附加属性在Xaml中弹出窗体

    嗯..最近回家去了,2个月没写过代码了,面试只能吹牛,基础都忘了,今天回顾一下,分享一篇通过附加属性去处理窗体弹出的情况. 或许老司机已经想到了,通过设置附加属性值,值变更的回调函数去处理窗体弹出,是 ...

  6. MVVM模式下WPF动态绑定展示图片

    MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...

  7. WPF学习笔记五之MVVM

    1.概念 MVVM是Model-View-ViewModel的缩写形式,它通常被用于WPF或Silverlight开发.这三者之间的关系如下图所示 模型(Model) Model——可以理解为带有字段 ...

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

    MVVM模式下,ViewModel和View,Model有什么区别 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就 ...

  9. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  10. wpf mvvm模式下CommandParameter传递多参

    原文:wpf mvvm模式下CommandParameter传递多参 CommandParameter一般只允许设置一次,所以如果要传递多参数,就要稍微处理一下.我暂时还没找到更好的方案,下面介绍的这 ...

随机推荐

  1. MySQL数据库中字符集的问题

    今天在做Hibernate案例,往mysql中写记录的时候,出现ERROR: Incorrect string value: '\xE5\x8A\xA0\xE5\x86\x85...' for col ...

  2. yii url美化 urlManager组件

    yii的官方文档对此的解释如下: urlSuffix  此规则使用的url后缀,默认使用CurlManger::urlSuffix,值为null.例如可以将此设置为.html,让url看起来“像”是一 ...

  3. Android项目实战(九):CustomShapeImageView 自定义形状的ImageView

    一个两年前出来的第三方类库,具有不限于圆形ImageView的多种形状ImageView,项目开发必备 github下载地址:https://github.com/MostafaGazar/Custo ...

  4. iOS设计模式之备忘录模式

    备忘录模式 基本理解 这个模式有三个关键角色:原发器(Originator).备忘录(Memento).看管人(caretaker).三者的基本关系是:原发器创建一个包含其状态的备忘录,并传给看管人. ...

  5. Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

    1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...

  6. 一些在IOS中关于JS、H5开发的网站

    1.JSPatch 2.

  7. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  8. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理

    1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以 ...

  9. 【nginx】常见的陷阱和错误

    很多人都可以碰到一个陷阱.下面我们列出,我们经常看到的问题,以及解释如何解决这些问题.在Freenode上的#nginx IRC频道这些讨论很频繁. 1.权限 从来不要使用777权限,查看目录的权限 ...

  10. C++杂谈(一)const限定符与const指针

    const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...