• wpf之mvvm基类


    当我们用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
       }
  • 相关阅读:
    环境变量不重启生效
    egret list不显示问题
    批处理收集
    吐槽阿里云数据库的备份还原
    一次没清缓存的坑
    imagepng或imagejpeg浏览器无显示问题
    xdebug调试一直等待连接
    Python快速学习07:文本文件的操作
    Python快速学习06:词典
    纸上谈兵: AVL树[转]
  • 原文地址:https://www.cnblogs.com/dairuiqing/p/4308285.html
Copyright © 2020-2023  润新知