转 WPF MVVM模式下关闭窗口的实现

转自https://www.cnblogs.com/XzcBlog/p/4876816.html

首先在nuget中找到

 

 

通过行为来实现

实现界面与逻辑的分离

窗口关闭行为:其中含有布尔型的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");
 
                //窗口关闭则重置窗口状态
                if (IsWinClose)
                {
                    ResetWindowCloseState();
                }
            }
        }
 
        //重置窗口状态
        private void ResetWindowCloseState()
        {
            IsWinClose = false;
        }
复制代码

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

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

posted @   小林野夫  阅读(488)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2022-03-14 【C# 序列化】System.Text.Json.Nodes ---Json数据交换格式 对应C#类
原文链接:https://www.cnblogs.com/cdaniu/
点击右上角即可分享
微信分享提示