WPF MVVM设计模式的ViewModelBase和CommandBase代码

本文提供了 WPF MVVM 设计模式中 ViewModelBase 和 CommandBase 的实现代码,包括属性更改通知和命令执行的基础功能。ViewModelBase 类实现了 INotifyPropertyChanged 接口并支持 IDisposable 接口,CommandBase 类则实现了 ICommand 接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewModelBase和CommandBase代码的整理如下:

1.ViewModelBase.cs

using System; using System.ComponentModel; using System.Linq.Expressions; /// <summary> /// WPF MVVC设计模式ViewMode基本功能类 /// </summary> public abstract class ViewModelBase : INotifyPropertyChanged, IDisposable { #region Public Properties /// <summary> /// 显示名称 /// </summary> public virtual string DisplayName { get; protected set; } #endregion #region Constructor /// <summary> /// 实例化一个ViewModelBase对象 /// </summary> protected ViewModelBase() { } #endregion #region INotifyPropertyChanged Members /// <summary> /// 触发属性发生变更事件 /// </summary> /// <typeparam name="T">泛型标记,会匹配函数返回类型,不必手动填写</typeparam> /// <param name="action">以函数表达式方式传入属性名称,表达式如下即可:()=>YourViewModelProperty</param> protected void OnPropertyChanged<T>(Expression<Func<T>> action) { var propertyName = GetPropertyName(action); OnPropertyChanged(propertyName); } private static string GetPropertyName<T>(Expression<Func<T>> action) { var expression = (MemberExpression)action.Body; var propertyName = expression.Member.Name; return propertyName; } private void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { var e = new PropertyChangedEventArgs(propertyName); handler(this, e); } } public event PropertyChangedEventHandler PropertyChanged; #endregion #region IDisposable Members public void Dispose() { this.OnDispose(); } /// <summary> /// 若支持IDisposable,请重写此方法,当被调用Dispose时会执行此方法。 /// </summary> protected virtual void OnDispose() { } #endregion }

2.CommandBase.cs

using System; using System.Windows.Input; /// <summary> /// WPF MVVC设计模式命令基本功能类 /// </summary> public class CommandBase : ICommand { #region Private Fields private readonly Action<object> _command; private readonly Func<object, bool> _canExecute; #endregion #region Constructor /// <summary> /// 实例化一个CommandBase对象 /// </summary> /// <param name="command">委托一个有object类型参数的命令执行函数</param> /// <param name="canExecute">委托一个有object类型参数的命令是否能被执行的函数(可选)</param> /// <exception cref="ArgumentNullException">参数command不可以为null引用</exception> public CommandBase(Action<object> command, Func<object, bool> canExecute = null) { if (command == null) throw new ArgumentNullException("command"); _canExecute = canExecute; _command = command; } #endregion #region ICommand Members public void Execute(object parameter) { _command(parameter); } public bool CanExecute(object parameter) { if (_canExecute == null) return true; return _canExecute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } #endregion }

关于WPF MVVM设计模式文档(Josh Smith),请阅读:http://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx

此代码是Josh Smith的范例修改版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值