WPF开发时光之痕日记本(二)—— WVVM基类

当我们用MVVM的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了。代码如下:

    public class ViewModelBase : INotifyPropertyChanged, IDisposable
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public bool IsInDesignMode;
        /// <summary> 显示名称 </summary>
        public virtual string DisplayName { get; protected set; }

        #region 构造

        public ViewModelBase()
        {

        }
        #endregion

        private void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        private static string GetProperyName(string methodName)
        {
            if (methodName.StartsWith("get_") || methodName.StartsWith("set_") ||
                methodName.StartsWith("put_"))
            {
                return methodName.Substring(4);
            }
            throw new Exception(methodName + " not a method of Property");
        }

        protected void SetProperty<T>(ref T name, T value)
        {
            if (object.Equals(name, value)) return;
            name = value;
            string propertyName = GetProperyName(new System.Diagnostics.StackTrace(true).GetFrame(1).GetMethod().Name);
            this.OnPropertyChanged(propertyName);
        }

        #region IDisposable Members
        public void Dispose()
        {
            this.OnDispose();
        }
        /// <summary>
        /// 若支持IDisposable,请重写此方法,当被调用Dispose时会执行此方法。
        /// </summary>
        protected virtual void OnDispose()
        {
        }
        #endregion
    }
    public class CommandBase : System.Windows.Input.ICommand
    {
        private Action<Object> _doWork;
        private readonly Func<object, bool> _canExecute;

        /// <summary>
        /// 实例化一个CommandBase对象
        /// </summary>
        /// <param name="doWork">委托一个有object类型参数的命令执行函数</param>
        /// <param name="canExecute">委托一个有object类型参数的命令是否能被执行的函数(可选)</param>
        /// <exception cref="ArgumentNullException">参数command不可以为null引用</exception>
        public CommandBase(Action<object> doWork, Func<object, bool> canExecute = null)
        {
            if (doWork == null)
                throw new ArgumentNullException("doWork");

            _canExecute = canExecute;
            _doWork = doWork;
        }
        public bool CanExecute(Object parameter)
        {
            return true;
        }
        public void Execute(Object parameter)
        {
            if (this._doWork != null)
                this._doWork(parameter);
        }
        public event EventHandler CanExecuteChanged
        {
            add { }
            remove { }
        }
    }

  使用方式如下,例:

 public class TestViewModel : ViewModelBase
    {
        public TestViewModel()
        {
            this.LoadCommand = new CommandBase((Object parameter) => Loading());
        }
        #region 属性

        private string _name;

        /// <summary> 是否可用 </summary>
        public string IsEnable
        {
            get { return _name; }
            set
            {
                base.SetProperty<string>(ref this._name, value);
            }
        }
        #endregion

        #region 命令

        /// <summary>
        /// 窗口加载命令
        /// </summary>
        public ICommand LoadCommand { get; set; }
        #endregion

        #region 方法

        /// <summary>
        /// 初始化方法
        /// </summary>
        public void Loading()
        {

        }
        #endregion
    }

  看了例子后,是不是感觉很简单呢?详细的测试代码会再后续的文章中提供给大家参考。

时间: 2024-10-04 15:10:56

WPF开发时光之痕日记本(二)—— WVVM基类的相关文章

WPF开发时光之痕日记本

   很久没有写东西了,新的一年新的开始吧. 很早就想自己开发一款日记本软件不仅自己使用,也可以让大家免费使用,最主要的是对自己有一个认可,自学WPF以来,感觉不很顺利,WPF的资料相对来说有点少,主要是自己太过急于求成了.好了,其它的话也就不多说了,本系列会讲解一些开发中的一些设计和技巧,希望对初学者有所帮助. 本篇给大家推荐一些东西: 1.WPF 版的富文本编辑器,Simple.HtmlEditor,具体网址大家可以找一找,我在这个编辑器的基础上修改了界面,增加了一些功能,模仿了kinded

WPF开发时光之痕日记本——终于完工了。。晒晒截图(三)

由于是业余时间学习的 WPF 的相关开发且不怎么会使用 Blend 软件,所以开发这个客户端着实花费了我很长时间,比如文本编辑器的开发,最初是在 Simple.HtmlEditor 的基础上做的修改,但由于一些无法解决的 BUG 而最终放弃了,后来干脆就自己开发一个吧,可定制性还高,想实现一些自己的功能也方便一些.最近终于是基本完工了,出来晒一下截图吧... 功能特色如下: 软件界面简单,使用方便,操作简便: 软件可按年份月份归档统计,按日记时间段.标题查询,日记列表拥有列表和概要两种模式,可以

WPF开发时光之痕日记本(一)——富文本编辑器

本篇给大家推荐一个 WPF 版的富文本编辑器,Simple.HtmlEditor,具体网址大家可以找一找,我在这个编辑器的基础上修改了界面,增加了一些功能,模仿了kindeditor 的界面,鉴于自己现在对WPF还不算纯熟,先凑合着用吧,等以后一定会自己写一个开源的WPF富文本编辑器的,功能有:基本的文本编辑,查看Html源码.打印.预览(未实现).导出文本文件.插入图片(不包含保存).插入表格等,界面如下: 1.字体颜色.背景颜色选择: 2.插入图片功能: 3.插入表格功能: 4.插入表情功能

开发自己的框架——(二)数据库工具类的封装

为了让框架的内容与数据分离,我们把常用的类封装到一个工具类中,当用到这些方法时,就调用这个封装好的类,能够使代码的复用性得到很大的提高.首先,封装数据库相关操作,为了使封装规范化,我们创建一个接口让数据库实现接口中的方法,数据库使用PDO扩展访问数据.数据库接口类 I_DAO.interface.php 1 <?php 2 interface I_DAO 3 { 4 //查询所有数据的功能 5 public function getAll($sql=''); 6 // //查询一条数据 7 pu

UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

UIManage单实例: 1 /// 单例模式的核心 2 /// 1,定义一个静态的对象 在外界访问 在内部构造 3 /// 2,构造方法私有化 4 5 private static UIManager _instance; 6 7 public static UIManager Instance 8 { 9 get 10 { 11 if (_instance == null) 12 { 13 _instance = new UIManager(); 14 } 15 return _instan

【Kinect开发笔记之(二)】Kinect for windows发展历程

新版本SDK和旧版本的SDK完全兼容,如果您之前安装过旧版本的,可以直接安装新版本的SDK,但是如果您之前的开发版本是Beta版的,则需要卸载之后再安装新版本.在Kinect for Windows SDK 1.0版本中,SDK和示例文件是打包一起安装的.而在之后的版本,为了可以分别升级,微软把这两者分开独立为Kinect for Windows SDK和Kinect for Windows Developer Toolkit这两部分,所以需要分别下载安装, Kinect for Windows

iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二--归档与设计可存储化的数据模型基类 一.引言 在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法.虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性.试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型. 二.先来精通归档吧 归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取.其存储与读取

Netron开发快速上手(二):Netron序列化

Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用Netron开发的实际应用请看:发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart 一.      Netron对象序列化 序列化Netron对象需要以下几个步骤: 添加序列化标签]Serializable] [Serializable] public class BlockSh

嵌入式linux开发uboot移植(二)——uboot工程源码目录分析

嵌入式linux开发uboot移植(二)--uboot工程源码目录分析 本文分析的uboot为uboot_smdkv210,是三星官方发布的基于S5PV210评估开发板对应的uboot. 一.uboot源码目录结构解析 1.cpu 本文件夹下的子文件与处理器相关,每个文件夹代表一种CPU系列.每个子目录中都包括cpu.c.interrupts.c.start.S文件. cpu.c主要用于初始化CPU.设置指令Cache和数据Cache等 interrupt.c主要用于设置系统的各种中断和异常 s