当我们用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
}

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

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

  1. WPF开发时光之痕日记本

       很久没有写东西了,新的一年新的开始吧. 很早就想自己开发一款日记本软件不仅自己使用,也可以让大家免费使用,最主要的是对自己有一个认可,自学WPF以来,感觉不很顺利,WPF的资料相对来说有点少,主 ...

  2. WPF开发时光之痕日记本——终于完工了。。晒晒截图(三)(已上传安装包)

    由于是业余时间学习的 WPF 的相关开发且不怎么会使用 Blend 软件,所以开发这个客户端着实花费了我很长时间,比如文本编辑器的开发,最初是在 Simple.HtmlEditor 的基础上做的修改, ...

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

    本篇给大家推荐一个 WPF 版的富文本编辑器,SmithHtmlEditor,具体网址大家可以找一找,我在这个编辑器的基础上修改了界面,增加了一些功能,模仿了kindeditor 的界面,鉴于自己现在 ...

  4. 【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法

    实际使用MVVM进行WPF开发的时候,可能会用到列表控件中每行一个编辑或删除按钮,这时直接去绑定,发现无法响应: <DataGridTemplateColumn Header="操作& ...

  5. wpf之mvvm基类

    当我们用MVVM设计模式的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了.代码如下:   1 2 3 4 5 6 7 8 9 10 1 ...

  6. 使用虚幻引擎中的C++导论(二-UE4基类)

    使用虚幻引擎中的C++导论(二) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...

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

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

  8. C++基类的析构函数定义为虚函数的原因

    1:每个析构函数只会清理自己的成员(成员函数前没有virtual).2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类 ...

  9. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

随机推荐

  1. Mybatis的mapper接口接受的参数类型

    最近项目用到了Mybatis,学一下记下来. Mybatis的Mapper文件中的select.insert.update.delete元素中有一个parameterType属性,用于对应的mappe ...

  2. C语言的数据类型及其对应变量

    声明,定义和初始化 声明标识符iden是告诉编译器"有这么一个变量var,具体var里是什么,你自己去看".声明只需要标识符的类型和标识符名字,C语言的任何标识符在使用前都需要声明 ...

  3. hdu 3064 twoNumber

    twoNumber Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 2048/1024 K (Java/Others) Total Su ...

  4. mysql、sql server、oracle数据库分页查询及分析(操作手册)

    1.mysql分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实 ...

  5. String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  6. CSS强制性换行word-break与word-wrap的使用

    一般情况下,元素拥有默认的white-space:normal(自动换行,不换行是white-space:nowrap),当录入的文字超过定义的宽度后会自动换行,但当录入的数据是一堆没有空格的字符或字 ...

  7. zstu-3769 数回文子串

    思路:用manacher求出每个位置的半径,相加即可. 代码:[rad[i]/2]即i这个位置的回文半径,添加的'#'代表长度为偶数的串. #include<stdio.h> #inclu ...

  8. Angular 入门学习

    1.Hello World 入门 源代码 <!doctype html> <html ng-app> <head> <script src="htt ...

  9. 搭建WP8开发环境

    开发环境 VS2012旗舰版 遇到的问题 安装WP SDK8.0出错提示: 根据当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内 解决办法 方法一:把操作系统的时间日期调整到系统的安装日期 ...

  10. QTP 10 安装及破解

    QTP(QuickTest Professional),是一款比较优秀的商业自动化测试工具,主要用于web项目和C/S结构程序的测试. QTP具有的一大特性:关键字驱动测试(keyword-drive ...