MVVM模式下关闭窗口的实现

通过行为来实现

实现界面与逻辑的分离

窗口关闭行为:其中含有布尔型的Close属性,将相应的关闭行为绑定到该属性上,则可以实现窗口的关闭行为,从而实现VM与View的分离

  public class WindowCloseBehaviour : Behavior<Window>
    {
        public static readonly DependencyProperty CloseProperty =
          DependencyProperty.Register(
          "Close",
          typeof(bool),
          typeof(WindowCloseBehaviour),
          new FrameworkPropertyMetadata(
                    false,
                    OnCloseChanged));

        public bool Close
        {
            get { return (bool)GetValue(CloseProperty); }
            set { SetValue(CloseProperty, value); }
        }

        private static void OnCloseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var window = ((WindowCloseBehaviour)d).AssociatedObject;
            var newValue = ((bool)e.NewValue);
            if (newValue)
            {
                window.Close();
            }
        }

View:
xmlns:event="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

而behaviors则是声明的WindowCloseBehaviour的命名空间

   <event:Interaction.Behaviors>
        <behaviors:WindowCloseBehaviour Close="{Binding IsWinClose}"/>
    </event:Interaction.Behaviors>

ViewModel:

   private bool _isWinClose;
        /// <summary>
        /// 指示窗口是否关闭
        /// </summary>
        public bool IsWinClose
        {
            get { return _isWinClose; }
            set
            {
                _isWinClose = value;
                OnPropertyChanged("IsWinClose");
            }
        }

在业务逻辑中只需要指定isWinClose = true那么就能够关闭窗口了;

当然实现的方式有很多种,用附加属性也是能够实现的;这里使用行为的话是为了指定类型从而避免附加属性的类型判断

时间: 2024-10-11 17:48:01

MVVM模式下关闭窗口的实现的相关文章

MVVM模式下 DataTemplate 中控件的绑定

原文:MVVM模式下 DataTemplate 中控件的绑定 今天给ListBox中通过DataTemplate生成的Button绑定命令时,一开始Button始终找不到绑定的命令.现找到了正确的绑定方式,特来记录一下. 先上个正确的示例: <ListBox Grid.Column="0" ItemsSource="{Binding CallBussiness}"> <ListBox.ItemsPanel> <ItemsPanelTem

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行

MVVM模式下如何使用ReactiveCocoa响应链式编程&lt;一&gt;

前一阵子公司要求项目从新架构,但又只给不到一个月的时间,这显然是不可能的.但从新架构又是在所难免的,和同事商定后决定一部分交互逻辑比较少的界面先使用MVVM架构,然后慢慢修改.下面整理了一下这次重构的遇到的问题,并希望能给大家一些帮助. 1.ReactiveCocoa的使用 要使用MVVM模式编程收下选择一个框架,当然不仅仅是ReactiveCocoa这一个框架,这里就不多说.当然我也没用过别的,如果哪位看官用过可以多多指教.接下来我就按步骤说了: 第一步:导入ReactiveCocoa框架,建

MVVM模式下的OpenFileDialog

对于MVVM模式下的ViewModel层来说,是不应该直接访问OpenFileDialog或者FolderBrowserDialog的,否则VM会变得难以测试. 参考StackOverFlow,对ViewModel进行改造,使OpenFileDialog动作也可以测试. 首先实现接口IIOService public interface IIOService { string OpenFileDialog(string srcFilter = ""); IList<string&

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

MVVM模式下,ViewModel和View,Model有什么区别 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工作无非就是从数据存储中读出数据,展现到用户界面上,然后从用户界面接收输入,写入到数据存储里面去.所以,对于数据 存储(model)和界面(view)这两层,大家基本没什么异议.但是,如何把model展现到view上,以及如何把数据从view写入到m

WPF MVVM模式下动画的实现

原文:WPF MVVM模式下动画的实现 在MVVM模式下,数据的显示都是通过绑定来实现的.当我们在ViewModel里修改数据时,View里面的界面会瞬间变化.但是如果我们希望这个变化有一个动画效果,应该怎么做呢? 可能一开始我们会想到DoubleAnimation.StoryBoard这些东西,但我们很快就会发现,它们只能操作View里面的元素,我们无法在ViewModel里使用它们. 我们在这里使用的方法是:创建一个类似DoubleAnimation的类,它的操作对象就是普通的double类

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的后台

MVVM 模式下iOS项目目录结构详细说明

?更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么?下面,我们将结合代码,说明 MVVM 设计模式以及项目目录结构. 一.MVVM 模式介绍  MVVM 是 Model-View-View Model 的缩写,MVVM 听起来好像很复杂的样子,但它本质上就是MVC 的改进版.MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和

WPF:MVVM模式下ViewModel关闭View

不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnableChange事件,在这个事件里,检测到传过来的值满足某个条件,即可触发Close()命令 如此,VM控制自己那个属性就能达到关闭V的目的了. 二.参数传递. 根据参数传递的不同.分为传递函数和传递View对象. 1传递函数 该方法:需要三步. 1.重写ViewModel的构造函数 public P