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

  • 相关阅读:
    设计算法,求AB两个整数集合的交集
    C++函数传递指针面试题
    C++构造函数、析构函数与抛出异常
    c++ 虚函数表解析
    c++ 对象的内存布局
    09 构造函数能调用虚函数吗?
    C++构造函数初始化顺序
    计数排序,基数排序和桶排序
    80 求论坛在线人数
    79 两个整数集合A和B,求其交集
  • 原文地址:https://www.cnblogs.com/xcsn/p/4462579.html
Copyright © 2020-2023  润新知