当我们用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. PHP 二维数组根据某个字段排序

    二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数 一. 手写arraysort PHP的一维数组排序函数: sort  对数组的值按 ...

  2. 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】

    一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...

  3. TFS Express backup and restore

    When we setup source control server, we should always make a backup and restore plan for it. This ar ...

  4. 用python DIY一个图片转pdf工具并打包成exe

    最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用python自己DIY一下: 这里主要用了reportlab.开始打算随便写几行,结果为若干坑纠结了挺久,于 ...

  5. [Linux] xargs 和 管道符的区别

    今天刚好遇到需要使用xargs的情况,就来研究一下xargs 和 管道符的区别 举几个例子,下面两个语句执行后的结果是什么呢? 1. zhang$ find . -name "*.prope ...

  6. MongoDB做为一项windows服务启动

    MongoDB做为一项windows服务启动 Windows版本安装 MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的对应版本,有32 ...

  7. Ajax跨域Post方法调用Web Api(NuGet配置的环境)

    没安装的去NuGet安装, 然后安装, 建立Web Api项目.需要在里的WebApiConfig.cs里配置 config.EnableSystemDiagnosticsTracing(); //感 ...

  8. 写给Git初学者的7个建议

    [原文] - http://blog.jobbole.com/50603/ 当我刚刚开始使用Git的版本控制时,我根本不确定我付出那么多时间是不是会得到回报.Branch.Stage.Stash,这些 ...

  9. C++-Qt【2】-实现一个简单的记事本

    用Qt实现一个简单的记事本: #include "helloqt.h" #include <qfiledialog.h> #include <qfile.h> ...

  10. BZOJ 2342 & manachar+最优性剪枝

    题意: 求最长回文串,串的两边都是回文串. Solution: manachar预处理然后暴力找... Code: #include <iostream> #include <cst ...