WPF開発時の痕跡日記帳(二)——MVVMベースクラス

4511 ワード

私たちが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
    }

例を見て、簡単な感じがしますか?詳細なテストコードは、後続の記事で参考にします.