zoukankan      html  css  js  c++  java
  • 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
       }
  • 相关阅读:
    python os模块汇总
    python xlsxwriter使用方法汇总
    python 虚拟环境生成requirements.txt 和利用requirements.txt批量安装
    python 中将大列表拆分成小列表
    python print的用法
    python学习
    浮躁
    在线绘图工具
    开通园子
    iOS拓展---(APP)进程间常用通信方式总结
  • 原文地址:https://www.cnblogs.com/dairuiqing/p/4308285.html
Copyright © 2011-2022 走看看