zoukankan      html  css  js  c++  java
  • WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand

    在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类。此篇主要介绍DelegateCommand来解决上面所遇到的问题。

    首先,我们创建自己的DelegateCommand。

    代码如下:

     /// <summary>
        /// 实现DelegateCommand
        /// </summary>
        class MyDelegateCommand : ICommand
        {
            /// <summary>
            /// 命令所需执行的事件
            /// </summary>
            public Action<object> ExecuteCommand { get; set; }
            /// <summary>
            /// 命令是否可用所执行的事件
            /// </summary>
            public Func<object, bool> CanExecuteCommand { get; set; }
    
            public MyDelegateCommand()
            {
            }
    
            public MyDelegateCommand(Action<object> execute, Func<object, bool> canexecute)
            {
                ExecuteCommand = execute;
                CanExecuteCommand = canexecute;
            }
    
            /// <summary>
            /// 命令可用性获取
            /// </summary>
            /// <param name="parameter"></param>
            /// <returns></returns>
            public bool CanExecute(object parameter)
            {
                return CanExecuteCommand(parameter);
            }
    
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }
    
            /// <summary>
            /// 命令具体执行
            /// </summary>
            /// <param name="parameter"></param>
            public void Execute(object parameter)
            {
                ExecuteCommand(parameter);
            }
        }

    其中的重点是利用两个委托,将方法的实现分离出去,接下来看我们的ViewModel:

      class TestViewModel : INotifyPropertyChanged
        {
    
            private string teststr;
            /// <summary>
            /// 待通知字符串
            /// </summary>
            public string TestStr
            {
                get { return teststr; }
                set
                {
                    teststr = value;
                    RaiseChanged("TestStr");
                }
            }
    
            /// <summary>
            /// 测试命令
            /// </summary>
            public ICommand TestCommand { get; set; }
    
    
            public TestViewModel()
            {
                TestCommand = new MyDelegateCommand();
                (TestCommand as MyDelegateCommand).ExecuteCommand = Test;
                (TestCommand as MyDelegateCommand).CanExecuteCommand = CanTest;
                //or
                //TestCommand = new MyDelegateCommand(Test, CanTest);
            }
    
            int i = 0;
            /// <summary>
            /// testcommand执行的方法
            /// </summary>
            /// <param name="para"></param>
            private void Test(object para)
            {
                i++;
                TestStr = i.ToString();
            }
            /// <summary>
            /// testcommand是否可用
            /// </summary>
            /// <param name="para"></param>
            /// <returns></returns>
            private bool CanTest(object para)
            {
                return true;
            }
    
            #region INotifyPropertyChanged接口实现
            public void RaiseChanged(string propertyname)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
            #endregion
        }

    其中的Test,CanTest就是之前写在Command中的实现,通过此实现,我们可以将界面呈现逻辑全部集中到ViewModel中。

    其界面还是一样使用上一篇的。


    项目代码托管地址:https://wpfmvvm.codeplex.com/
    就是爱玩耍,各种玩![‘假’技术‘真’宅]
    个人网站:http://www.shisujie.com
  • 相关阅读:
    [无聊测试赛] T12 道路
    [无聊测试赛] T9 矩阵覆盖
    [无聊测试赛] T10 所驼门王的宝藏
    [无聊测试赛] T8 佳佳的魔法药水
    [无聊测试赛] T7 豪华游轮
    [无聊测试赛] T6 排行榜
    【模板】三分求函数极值
    树的重心模板
    倍增最近公共祖先(LCA)
    ccf201612题解
  • 原文地址:https://www.cnblogs.com/huaxia283611/p/4194665.html
Copyright © 2011-2022 走看看