2010-08-08 4 views
4

Il y a plusieurs exemples sur la façon de définir une RelayCommand dans le ViewModel:MVVM Light: RelayCommand: le définir paresseux ou dans le constructeur?

Option 1 (paresseux):

/// <summary> 
/// Gets the LogOnCommand. 
/// </summary> 
/// <value>The LogOnCommand.</value> 
public RelayCommand<LogOnUser> LogOnCommand 
{ 
    get 
    { 
     if (this.logOnCommand == null) 
     { 
      this.logOnCommand = new RelayCommand<LogOnUser>(
       action => 
       { 
        // Action code... 
       }, 
       g => g != null); 
     } 

     return this.logOnCommand; 
    } 
} 

Option 2 (en constructeur)

/// <summary> 
/// Initializes a new instance of the <see cref="LogOnFormViewModel"/> class. 
/// </summary> 
public LogOnFormViewModel() 
{ 
    this.logOnCommand = new RelayCommand<LogOnUser>(
       action => 
       { 
        // Action code... 
       }, 
       g => g != null); 
} 

/// <summary> 
/// Gets the LogOnCommand. 
/// </summary> 
/// <value>The LogOnCommand.</value> 
public RelayCommand<LogOnUser> LogOnCommand {get; private set;} 

Quel est le meilleur/le design le plus clair?

Répondre

10

Cela dépend vraiment du style que vous préférez. La plupart des gens n'aiment pas avoir un tas de logique dans les getters de propriété s'ils peuvent l'éviter.

Personnellement, je préfère avoir une vraie méthode à appeler au lieu d'une méthode anonyme. Mes ViewModels ressemblent à ceci.

public class MyViewModel : ViewModelBase 
{ 
    public RelayCommand<CommandParam> MyCommand { get; private get; } 

    public MyViewModel() 
    { 
     CreateCommands(); 
    } 

    private void CreateCommands() 
    { 
     MyCommand = new RelayCommand<CommandParam>(MyCommandExecute); 
    } 

    private void MyCommandExecute(CommandParam parm) 
    { 
     // Action code... 
    } 
} 

Notez que si vous ne l'utilisez la commande enable, vous n'avez pas besoin d'appeler la surcharge de cteur qui établit que.

Questions connexes