NET标准的ICommand实现

时间:2018-08-06 13:28:34

标签: mvvm .net-standard icommand

我正在使用具有ViewModel的跨平台(Windows,iOS,Android).NET标准库。

在此视图模型中,我需要使用ICommand,但是我发现的所有实现都依赖于平台。我可以通过IoC容器使用它们,但是与跨平台方法相比,这是次等的解决方案。

在没有依赖于平台的代码(也没有不良实践)的情况下,有什么方法可以实现ICommand?

1 个答案:

答案 0 :(得分:1)

PrismMVVM-Light之类的库有助于减少样板代码的数量。如果您真的不想依赖它们,则可以轻松滚动自己的命令界面版本。您需要做的就是创建一个实现ICommand接口的新类,并实现这些方法。

article的标题为“基本”,但在这种情况下,我将其称为“基本”,因为即使使用MVVM-Light之类的库,也要了解幕后的情况,一般情况。

如果链接消失,这是ICommand接口的基本实现。网上有一些更优雅的版本。找到自己喜欢的人,或根据自己的喜好自己做。

public class RelayCommand : ICommand
{
   private Action<object> execute;

   private Predicate<object> canExecute;

   private event EventHandler CanExecuteChangedInternal;

   public RelayCommand(Action<object> execute)
       : this(execute, DefaultCanExecute)
   {
   }

   public RelayCommand(Action<object> execute, Predicate<object> canExecute)
   {
       if (execute == null)
       {
           throw new ArgumentNullException("execute");
       }

       if (canExecute == null)
       {
           throw new ArgumentNullException("canExecute");
       }

       this.execute = execute;
       this.canExecute = canExecute;
   }

   public event EventHandler CanExecuteChanged
   {
       add
       {
           CommandManager.RequerySuggested += value;
           this.CanExecuteChangedInternal += value;
       }

       remove
       {
           CommandManager.RequerySuggested -= value;
           this.CanExecuteChangedInternal -= value;
       }
   }

   public bool CanExecute(object parameter)
   {
       return this.canExecute != null && this.canExecute(parameter);
   }

   public void Execute(object parameter)
   {
       this.execute(parameter);
   }

   public void OnCanExecuteChanged()
   {
       EventHandler handler = this.CanExecuteChangedInternal;
       if (handler != null)
       {
           //DispatcherHelper.BeginInvokeOnUIThread(() => handler.Invoke(this, EventArgs.Empty));
           handler.Invoke(this, EventArgs.Empty);
       }
   }

   public void Destroy()
   {
       this.canExecute = _ => false;
       this.execute = _ => { return; };
   }

   private static bool DefaultCanExecute(object parameter)
   {
       return true;
   }
}