2012-09-18 13 views

Respuesta

4

Hay una versión 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

Simplemente vamos a señalar que este archivo no tiene la clase 'NotifyPropertyChanged' a la que hace referencia, y la mayoría de las personas sabrá cómo volver a crearlo, pero puede ser útil incluirlo para aquellos que no lo hacen. –

+2

@OwenJohnson 'NotifyPropertyChanged' encontrado aquí: https://mytoolkit.svn.codeplex.com/svn/Shared/MVVM/NotifyPropertyChanged.cs – mydogisbox

+0

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

1

No hay ninguna aplicación si ICommand proporciona en metro, aunque hay varias versiones disponibles, tales como éste en CodeProject.

0

Prisma para Windows Tienda aplicaciones ahora está disponible, que contiene DelegateCommand (que implementa ICommand), así como una implementación de OnPropertyChanged.

Cuestiones relacionadas