当我们用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. Linux iptables

    一.简介 http://liaoph.com/iptables/ 二.操作 1)查看规则 iptables -t filter -L -n iptables -t nat -L -n iptables ...

  2. bzoj-2748 2748: [HAOI2012]音量调节(dp)

    题目链接: 2748: [HAOI2012]音量调节 Time Limit: 3 Sec  Memory Limit: 128 MB Description 一个吉他手准备参加一场演出.他不喜欢在演出 ...

  3. jquery 实现邮箱输入自动提示功能:(一)

    记得去年做某个项目的时候,用到了邮箱输入自动提示功能,于是网上搜了一下,发现了这个写得不错,现在回想起来,转载一下,方便查阅. 邮箱的广泛使用得益于它的免费,因此很多网站在注册的时候都会直接使用邮箱作 ...

  4. POJ 2464 Brownie Points II --树状数组

    题意: 有点迷.有一些点,Stan先选择某个点,经过这个点画一条竖线,Ollie选择一个经过这条直接的点画一条横线.Stan选这两条直线分成的左下和右上部分的点,Ollie选左上和右下部分的点.Sta ...

  5. Android数据存储(一)----SharedPreferences详解

    一.Android数据的存储方式: Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File:此外还有一种网络存储 ...

  6. Volley(三)—— ImageRequest & Request简介

    Volley(三)—— ImageRequest & Request简介 上 篇文章我们讲 到了如何用volley进行简单的网络请求,我们可以很容易的接受到string.JsonObjec类型 ...

  7. getBoundingClientRect详解

    getBoundingClientRect获取的left和top始终是该元素相对于页面原点坐标的位置,当它大于原点坐标则为正数,等于原点坐标为零,小于为负数.

  8. BIO、NIO与NIO.2的区别与联系

    BIO.NIO.NIO.2之间的区别主要是通过同步/异步.阻塞/非阻塞来进行区分的 同步: 程序与操作系统进行交互的时候采取的是问答的形式 异步: 程序与操作系统取得连接后,操作系统会主动通知程序消息 ...

  9. usb驱动开发10之usb_device_match

    在第五节我们说过会专门分析函数usb_device_match,以体现模型的重要性.同时,我们还是要守信用的. 再贴一遍代码,看代码就要不厌其烦. static int usb_device_matc ...

  10. [资料]pthreads PHP

    1. 参考手册http://php.net/manual/zh/book.pthreads.php 2. windows下安装php真正的多线程扩展pthreads教程http://www.think ...