2012-09-18 16 views

risposta

4

Esiste una versione here.

using System; 
using System.Diagnostics; 

#if METRO 
using Windows.UI.Xaml.Input; 
using System.Windows.Input; 
#else 
using System.Windows.Input; 
#endif 

namespace MyToolkit.MVVM 
{ 
#if METRO 
    public class RelayCommand : NotifyPropertyChanged, ICommand 
#else 
    public class RelayCommand : NotifyPropertyChanged<RelayCommand>, ICommand 
#endif 
    { 
     private readonly Action execute; 
     private readonly Func<bool> canExecute; 

     public RelayCommand(Action execute) 
      : this(execute, null) { } 

     public RelayCommand(Action execute, Func<bool> canExecute) 
     { 
      if (execute == null) 
       throw new ArgumentNullException("execute"); 

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

     bool ICommand.CanExecute(object parameter) 
     { 
      return CanExecute; 
     } 

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

     public bool CanExecute 
     { 
      get { return canExecute == null || canExecute(); } 
     } 

     public void RaiseCanExecuteChanged() 
     { 
      RaisePropertyChanged("CanExecute"); 
      if (CanExecuteChanged != null) 
       CanExecuteChanged(this, new EventArgs()); 
     } 

     public event EventHandler CanExecuteChanged; 
    } 

    public class RelayCommand<T> : ICommand 
    { 
     private readonly Action<T> execute; 
     private readonly Predicate<T> canExecute; 

     public RelayCommand(Action<T> execute) 
      : this(execute, null) 
     { 
     } 

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

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

     [DebuggerStepThrough] 
     public bool CanExecute(object parameter) 
     { 
      return canExecute == null || canExecute((T)parameter); 
     } 

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

     public void RaiseCanExecuteChanged() 
     { 
      if (CanExecuteChanged != null) 
       CanExecuteChanged(this, new EventArgs()); 
     } 

     public event EventHandler CanExecuteChanged; 
    } 
} 
+2

Basta sottolineare che questo file non ha la classe 'NotifyPropertyChanged' a cui fa riferimento, e molte persone sapranno come ricrearlo, ma potrebbe essere utile includerlo per coloro che non lo fanno. –

+2

@OwenJohnson 'NotifyPropertyChanged' trovato qui: https://mytoolkit.svn.codeplex.com/svn/Shared/MVVM/NotifyPropertyChanged.cs – mydogisbox

+0

Vedere https://xp-dev.com/svn/mytoolkit/Shared/MVVM/ NotifyPropertyChanged.cs –

1

non ci sono implementazioni se ICommand fornito in metropolitana, anche se ci sono diverse versioni disponibili, come questo su CodeProject.

0

Prisma per le app di Windows Store è ora disponibile, che contiene DelegateCommand (che implementa ICommand), oltre a un'implementazione di OnPropertyChanged.

Problemi correlati