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

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

矫枉过正,从一个极端走向另一个极端。MVVM模式,View只负责呈现,虽然也有后台代码,但基本上就是摆设,VM接管了一切的逻辑处理。那么,现在,大能的VM已经完成了所有的事情,这个窗口V如何才能自动关闭呢?据我目前少得可怜的WPF知识可知,有两种方案:


例1 利用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"); } } }


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




原文:

blog.csdn.net/leftfist/ 如有侵权,请联系删除!



最后,给大家介绍下 ,软谋的全套.NET架构视频, 大多视频包含源码,录制时间(初中级是2019~2020高级架构是2020~2021) ,原价6499,现仅需299元。三天时间我从我这里60多人抢购,活动即将终止,后续将推出Java同款,需要Java的可以联系我! .NET视频介绍可以看这下面链接:

.NET架构整套视频来了

需要的加微信zls20210502或者扫码

发布于 2022-03-11 08:11