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

最新文章

  1. 数据结构:优先队列 基于堆实现(python版)
  2. juery学习总结(一)——juery选择器
  3. 安装Openfile环境和组件XMPP
  4. checkbox全选与反选
  5. webstorm 代码自动换行
  6. [moka收藏]php正则表达式验证
  7. Project和Module的介绍
  8. c# Random Class usage
  9. Linux&amp;UNIX上卸载GoldenGate的方法
  10. 亲手用模块化方式写一个jquery QQ表情插件。
  11. python学习第五天 List和tuple类型介绍及其List切片
  12. rc.local自启动学习
  13. Event notifications
  14. JS时间的获取及格式
  15. 简单有效:解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
  16. 伪分布式hadoop1.1.2和hbase0.94.11配置
  17. vue 去除前后空格trim
  18. Flex 编写 loading 组件
  19. case功能菜单选项
  20. perl模块终极解决方案--转载

热门文章

  1. Button 对 TreeView1 所有节点的全选
  2. svn 服务器不能看log问题
  3. 初识UIScrollView
  4. Android学习一(入门)
  5. 使用Java正则表达式提取字符串中的数字一例
  6. C/S架构程序多种类服务器之间实现单点登录(转)
  7. SQL基础(2)-约束
  8. windows 下my.ini的配置优化
  9. 关于mac环境下删除cocos2d-x环境变量配置的方法
  10. ASP.NET5 MVC6入门教学之一(自己动手)