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

简介: 原文:http://blog.csdn.net/leftfist/article/details/32349731 矫枉过正,从一个极端走向另一个极端。MVVM模式,View只负责呈现,虽然也有后台代码,但基本上就是摆设,VM接管了一切的逻辑处理。

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

 

相关文章
|
4月前
|
C#
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
75 1
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
|
4月前
|
C#
halcon联合c#、WPF学习笔记二(简单案例)
halcon联合c#、WPF学习笔记二(简单案例)
118 0
|
4月前
|
C# C++
halcon联合c#、WPF学习笔记一(WPF配置halcon)
halcon联合c#、WPF学习笔记一(WPF配置halcon)
134 1
|
8月前
|
设计模式 开发框架 前端开发
深入理解WPF中MVVM的设计思想
近些年来,随着WPF在生产,制造,工业控制等领域应用越来越广发,很多企业对WPF开发的需求也逐渐增多,使得很多人看到潜在机会,不断从Web,WinForm开发转向了WPF开发,但是WPF开发也有很多新的概念及设计思想,如:数据驱动,数据绑定,依赖属性,命令,控件模板,数据模板,MVVM等,与传统WinForm,ASP.NET WebForm开发,有很大的差异,今天就以一个简单的小例子,简述WPF开发中MVVM设计思想及应用。
62 0
|
9月前
|
前端开发
WPF-Binding问题-MVVM中IsChecked属性CommandParameter转换值类型空异常
WPF-Binding问题-MVVM中IsChecked属性CommandParameter转换值类型空异常
89 0
|
10月前
|
前端开发 算法 JavaScript
走进WPF之MVVM完整案例
走进WPF之MVVM完整案例
156 0
|
前端开发 C# 图形学
【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。
567 0
【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
|
前端开发 C# 数据库
WPF MVVM系统入门-下
本文详细讲解WPF,MVVM开发,实现UI与逻辑的解耦。
|
前端开发 数据可视化 C#
WPF MVVM系统入门-上
本文详细讲解WPF,MVVM开发,实现UI与逻辑的解耦。
|
1月前
|
C# 开发者 Windows
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库