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

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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 { }
    }
}

  使用方式如下,例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
   }

wpf之mvvm基类的更多相关文章

  1. WPF自学入门(九)WPF自定义窗口基类

    今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...

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

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

  3. WPF之数据绑定基类

    数据绑定方法 在使用集合类型作为列表控件的ItemsSource时一般会考虑使用ObservalbeCollection,它实现了INotifyCollectionChanged和INotifyPro ...

  4. WPF自定义窗口基类

    WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...

  5. WPF MVVM 写一个健壮的INotifyPropertyChanged基类

    当我们用MVVM的时候要实现INotifyPropertyChanged,如果你是基于.net4.5以下的framework(.net4.5已有新特性我这里就不说了) 你很可能会这么写 public ...

  6. WPF组件开发之组件的基类

    之前在网上看到很多关于组件开发的资料,但真正可以用到框架内的却很少.今天贴出自己做的组件,并适合大部分框架的代码. 组件开发需要先做出组件的基类,然后由其他的各类组件去继承这个基类,下面是组件基类的代 ...

  7. 《Programming WPF》翻译 第9章 2.选择一个基类

    原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类, ...

  8. WPF 窗体基类实现的体验及实现回车到下一控件

    原文:WPF 窗体基类实现的体验及实现回车到下一控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/jsyhello/article/details ...

  9. WPF 之 创建继承自Window 基类的自定义窗口基类

    开发项目时,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 Window 自身的,但窗口的外边框及窗口移动.最小化等标题栏操作基本都是一样的.所以通过查看资料,可按如下方法创建继承 ...

随机推荐

  1. lattice 与 modelsim 仿真 笔记

    对于 lattice  Diamond 与 modelsim 的联合仿真,我总结了一句话,那就是—— 难者不会,会者不难.  也许刚开始 觉得 摸不着 头脑,但是 一旦学会 感觉还是很简单和直观的. ...

  2. 与你相遇好幸运,德淘gen8历程

    应该是十月底了 , 在浏览色魔张大妈(smzdm) http://www.smzdm.com/p/6517684/ 的时候看见了这个 , 以前大学就想买个这个 , 苦于没钱.... 然后当时打算买 , ...

  3. 【疑难杂症系列01】TypeError: alert is not a function

    一.背景 话说今天在调试js的时候,碰到一个很奇怪的问题,现记录一下.当使用alert()函数弹出提示时,总是报错,你没看错,alert函数报错了. 二.详细说明 当时正在做一个关于告警的页面展示功能 ...

  4. AngularJS学习 01进入Angular世界

    Angular下载 各个版本的下载地址:https://code.angularjs.org/ 打开上述URL,页面如下图: 点击需要的版本,跳出如下页面: 点击红色框内容即可下载完整的压缩包. 还可 ...

  5. 重写AgileEAS.NET SOA 中间件平台账号密码的加密算法

    一.平台简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适 ...

  6. 【iOS Instrument性能优化集】

    iOS Instrument性能优化集 1.UIImage缓存取舍 在项目代码中看到大量使用如下代码: UIImage使用 在Main Thread中发现不同动画场景中Image IO 开销和耗时所占 ...

  7. supervisor-2:event

    转载别人博客,做个记录 原文链接:http://lixcto.blog.51cto.com/4834175/1540169 supervisor的event机制其实,就是一个监控/通知的框架.抛开这个 ...

  8. TProfiler

    下载:访问 TProfiler 的 GitHub 主页,https://github.com/alibaba/TProfiler,点击 Clone or download 按钮的打开下载选项,点击该选 ...

  9. [spring源码学习]十、IOC源码-conversionService

    一.代码示例 1.我们在之前的Person类里新增一个两个属性,分别是客户的兴趣和生日,兴趣爱好有很多,我们使用list进行保存,生日使用日期进行保存 public class Person { pr ...

  10. LeetCode 389. Find the Difference

    Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...