• ICommand接口


    ICommand 接口是常用接口,在wpf中,经常会为一个button或者一个link绑定一个command

       public interface ICommand
        {
            // 摘要:
            //     当出现影响是否应执行该命令的更改时发生。
            event EventHandler CanExecuteChanged;

            // 摘要:
            //     定义用于确定此命令是否可以在其当前状态下执行的方法。
            //
            // 参数:
            //   parameter:
            //     此命令使用的数据。如果此命令不需要传递数据,则该对象可以设置为 null。
            //
            // 返回结果:
            //     如果可以执行此命令,则为 true;否则为 false。
            bool CanExecute(object parameter);
            //
            // 摘要:
            //     定义在调用此命令时调用的方法。
            //
            // 参数:
            //   parameter:
            //     此命令使用的数据。如果此命令不需要传递数据,则该对象可以设置为 null。
            void Execute(object parameter);
        }

    这是VS中icommand的原型,一个事件,一个Action(无返回值的委托函数),一个Func(有返回值的委托函数)

    新建一个FishCommand类,继承ICommand接口,实现它的两个方法,在这里,类的构造函数里直接传入一个Action和一个Func

     class FishCommand : ICommand
        {
            private Func<object, bool> _CanExecute;
            private Action<object> _Execute;

            public FishCommand(FishExecute execute,FishCanExecute canExecuteFunc)
            {
                _CanExecute = canExecuteFunc;
                _Execute = execute;
            }

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

            public bool CanExecute(object parameter)
            {
                return _CanExecute == null ? true : _CanExecute(parameter);
            }

            public void Execute(object parameter)
            {
                if (_Execute != null)
                {
                    _Execute(parameter);
                }
            }
        }

    这里做一个假设,假设一个button,它的功能是要做一个10秒钟的任务,当然啦,在任务进行时,这个按钮状态是不能用的,知道任务结束,按钮才能继续用,简单的一个方案是 在button的 enable属性上绑定一个bool属性,让command执行Action 的时候把属性置为false,当func结束时,再把属性置为true,就能很好的进行控制,当然你也可以在button中写一个bool的依赖属性,像这样

     public  class FishButton:Button
        {
          public static readonly DependencyProperty IsBusyProperty = DependencyProperty.Register("IsBusy", typeof(Boolean), typeof(FishButton));

          public bool IsBusy
          {
              get { return (bool)GetValue(IsBusyProperty); }
              set { SetValue(IsBusyProperty, value); }
          }
        }

      <fish:FishButton Width="60" Height="40" Content="click" Command="{Binding IsClick}" Grid.Column="0" Grid.Row="1" IsBusy="{Binding IsFree}"/>

    直接绑定依赖属性一方面更简洁,另一方面,也更加效率


            private ICommand _isClick;
            public ICommand IsClick
            {
                get
                {
                    if (_isClick == null)
                    {
                        _isClick = new FishCommand(data =>
                        {

              IsFree = false;
                           //这里写你的方法,可以用异步的方式,就不会让button卡在那里

              IsFree = false;
                        }, o => IsFree);
                    }
                    return _isClick;
                }
            }

    这里我是在Action中直接设置属性,wpf的通知机制会帮你处理好binding,这样的话,就能够很好的用一个属性在command中控制button的状态

            bool CanExecute(object parameter); 这个方法就是可以控制button命令是否能用的方法

    若有兴趣,可以联系,讨论

    qq 124312457

  • 相关阅读:
    问题账户需求分析
    2017年秋季个人阅读计划
    读“我们应当怎样做需求分析”有感
    开发体会
    第二阶段个人总结10
    第二阶段个人总结09
    第二阶段个人总结08
    个人进度(13)
    个人进度(12)
    个人进度(11)
  • 原文地址:https://www.cnblogs.com/fish124423/p/2505924.html
Copyright © 2020-2023  润新知