2010-09-22 20 views
12

Lors de l'utilisation de RelayCommand Josh Smith, la plupart des exemples que je l'ai vu utiliser l'initialisation paresseuse comme:Pourquoi les RelayCommands utilisent-ils généralement une initialisation paresseuse?

public class ViewModel 
{ 
    private ICommand myCommand; 

    public ICommand MyCommand 
    { 
     get 
     { 
      if (myCommand == null) 
      { 
       myCommand = new RelayCommand(p => DoSomething()); 
      } 

      return myCommand; 
     } 
    } 
    // ... stuff ... 

} 

Plutôt que de créer le RelayCommand dans le constructeur, comme celui-ci:

public class ViewModel 
{ 
    public ViewModel() 
    { 
      MyCommand = new RelayCommand(p => DoSomething()); 
    } 

    public ICommand MyCommand 
    { 
     get; 
     private set; 

    } 

    // ... stuff ... 
} 

Quelle est la avantage d'utiliser l'initialisation paresseux ici? Il devra appeler la propriété get lors de la mise en place de la liaison, donc je ne vois pas de raison d'utiliser cette méthode sur les réglages du constructeur.

Ai-je oublié quelque chose ici?

+0

Vous avez raison. L'initialisation paresseuse de RoutedCommands n'a aucun sens car elles sont très légères et elles sont chargées de toute façon dès que View les lie. – jbe

Répondre

15

En fait, WPF et Silverlight obtenir la commande de relais juste une fois par la liaison, de sorte que vous ne avez pas vraiment besoin de stocker un champ de support du tout:

public ICommand MyCommand 
{ 
    get 
    { 
     return new RelayCommand(p => DoSomething()); 
    } 
} 

Ainsi, alors il n'y a rien de mal à créer dans le .ctor comme vous le suggérez, il y a très peu de raisons de le faire.

+2

_ "WPF et Silverlight recevront la commande de relais une seule fois par liaison" _ - Je sais que c'est vrai en pratique. Mais, étant donné que la documentation ne promeut pas ce comportement, est-il vraiment judicieux de créer un nouvel objet chaque fois que la valeur de la propriété est récupérée? Qu'est-ce qui se passe ce jour-là que Microsoft, pour une raison quelconque, décide qu'il est plus logique de laisser votre objet modèle garder la référence d'objet de commande au lieu de le mettre en cache quelque part, et ils reçoivent juste la valeur de la propriété chaque fois qu'ils en ont besoin? –

+2

@Peter Duniho: Non seulement Microsoft; mon modèle de vue appelle ses commandes (et CanExecute()) directement à partir de ses propres méthodes tout le temps. Donc, non, il serait imprudent de créer une nouvelle instance à chaque fois. – BoltClock

+0

@BoltClock: bon point. Je vais être plus explicite sur les scénarios dans [l'autre poste] (https://stackoverflow.com/a/46420039) –