zoukankan      html  css  js  c++  java
  • WPF开发时光之痕日记本(二)—— MVVM基类

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

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

  • 相关阅读:
    重构29-Remove Middle Man(去掉中间人)
    重构30-Return ASAP(尽快返回)
    重构26-Remove Double Negative(去掉双重否定)
    yaml语法学习3
    运行原理探究2
    SpringBoot简介 1
    SpringMVC项目所引用的一切依赖jar包和自定义设置
    2020/07/03 初始mybatis
    json数据格式字符串在java中的转移
    项目中遇到的一些异常
  • 原文地址:https://www.cnblogs.com/shanlin/p/4272419.html
Copyright © 2011-2022 走看看