WPF 一个MVVM的简单例子

如下图是系统的结构图:这个示例是模仿计算器的MVVM模式的精简版,非常简单。

WPF 一个MVVM的简单例子_第1张图片

这篇文章就开门见山了,有关MVVM的理论部分,请参考MVVM设计模式

1、App中的代码:

        public App()
        {
            CalculatorView view = new CalculatorView();
            view.DataContext = new CalculatorViewModel();
            view.Show();
        }

2、Model层中CauculatorModel的代码

     class CauculatorModel
    {
         public string FirstOperand { get; set; }
         public string SecondOperand { get; set; }
         public string Operation { get; set; }
         public string Result { get; set; }
    }

3、Command

   public class DeletgateCommand:ICommand
    {
        private readonly Action _executeMethod = null;
        private readonly Func _canExecuteMethod = null;

        public DeletgateCommand(Action executeMethod)
            : this(executeMethod, null)
        { }

        public DeletgateCommand(Action executeMethod, Func canExecuteMethod)  
        {
            if (executeMethod == null)
                throw new ArgumentNullException("executeMetnod");
            _executeMethod = executeMethod;
            _canExecuteMethod = canExecuteMethod;
        }

        #region ICommand 成员
        /// 
        ///  Method to determine if the command can be executed
        /// 
        public bool CanExecute(T parameter)
        {
            if (_canExecuteMethod != null)
            {
                return _canExecuteMethod(parameter);
            }
            return true;

        }

        /// 
        ///  Execution of the command
        /// 
        public void Execute(T parameter)
        {
            if (_executeMethod != null)
            {
                _executeMethod(parameter);
            }
        }

        #endregion


        event EventHandler ICommand.CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        #region ICommand 成员

        public bool CanExecute(object parameter)
        {
            if (parameter == null && typeof(T).IsValueType)
            {
                return (_canExecuteMethod == null);

            }
            
            return CanExecute((T)parameter);
        }

        public void Execute(object parameter)
        {
            Execute((T)parameter);
        }

        #endregion
    }

 

4、ViewModwl层,为了简化,此处Add方法采用硬编码的形式

   public class CalculatorViewModel
    {
        CauculatorModel calculatorModel;
        private DeletgateCommand addCommand;
        

        public CalculatorViewModel()
        {
            calculatorModel = new CauculatorModel();
        }

        #region Public Properties
        public string FirstOperand
        {
            get {  return calculatorModel.FirstOperand;  }
            set { calculatorModel.FirstOperand = value;  }
        }
        public string SecondOperand
        {
            get { return calculatorModel.SecondOperand; }
            set { calculatorModel.SecondOperand = value; }
        }
        public string Operation
        {
            get { return calculatorModel.Operation; }
            set { calculatorModel.Operation = value; }
        }
        public string Result
        {
            get { return calculatorModel.Result; }
            set { calculatorModel.Result = value; }
        }
        #endregion

        public ICommand AddCommand
        {
            get
            {
                if (addCommand == null)
                {
                    addCommand = new DeletgateCommand(Add, CanAdd);
                }
                return addCommand;

            }
        }
           
        public  void Add(string x)
        {
            FirstOperand = x;
            SecondOperand = x;
            Result = (double.Parse(FirstOperand) + double.Parse(SecondOperand)).ToString();
            Operation = "+";
            MessageBox.Show( FirstOperand+ Operation +SecondOperand +"=" + Result);
        }

        private static bool CanAdd(string num)
        {
            return true;
        }
    }

 

ViewModelBase中的代码:

   public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }

 5、View层

     
        
        
        
    

 CommandParameter里传递的是一个参数,当然可以传递多个参数。

6、效果图:

WPF 一个MVVM的简单例子_第2张图片

参考资料:MVVM的一个Example

 

 

你可能感兴趣的:(WPF 一个MVVM的简单例子)