2010-09-22 12 views
12

Wenn RelayCommand, die meisten Beispiele der Verwendung von Josh Smith ich gesehen Verwendung faul Initialisierung haben wie:Warum verwenden RelayCommands normalerweise eine verzögerte Initialisierung?

public class ViewModel 
{ 
    private ICommand myCommand; 

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

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

} 

Anstatt die RelayCommand im Konstruktor erstellen, wie folgt aus:

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

    public ICommand MyCommand 
    { 
     get; 
     private set; 

    } 

    // ... stuff ... 
} 

Was das ist Vorteil der Verwendung von Lazy-Initialisierung hier? Es muss die get-Eigenschaft aufrufen, wenn die Bindung eingerichtet wird, also habe ich keinen Grund gesehen, diese Methode über Einstellungen im Konstruktor zu verwenden.

Fehle ich hier etwas?

+0

Sie haben Recht. Lazy-Initialisierung von RoutedCommands macht keinen Sinn, da sie sehr leicht sind und trotzdem geladen werden, sobald die View an sie bindet. – jbe

Antwort

15

Eigentlich WPF und Silverlight werden den Relais Befehl nur einmal bekommen pro Bindung, so dass Sie nicht wirklich brauchen überhaupt ein dahinter liegendes Feld zu speichern:

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

So, während es ist nichts falsch mit ihm zu schaffen, in die .ctor, wie Sie vorschlagen, gibt es sehr wenig Grund zu.

+2

_ "WPF und Silverlight erhalten den Relaisbefehl nur einmal pro Bindung" _ - Ich weiß, dass dies in der Praxis der Fall ist. Aber angesichts der Tatsache, dass dieses Verhalten in der Dokumentation nicht empfohlen wird, ist es wirklich sinnvoll, jedes Mal, wenn der Eigenschaftswert abgerufen wird, ein neues Objekt zu erstellen? Was passiert an diesem Tag, an dem Microsoft aus irgendeinem Grund entscheidet, dass es sinnvoller ist, dass Ihr Modellobjekt den Verweis auf das Befehlsobjekt behält, anstatt es irgendwo zwischenzuspeichern, und dass sie den Wert von der Eigenschaft jedes Mal erhalten, wenn sie es brauchen? –

+2

@Peter Duniho: Nicht nur Microsoft; Mein Ansichtsmodell ruft seine Befehle (und CanExecute()) immer direkt von seinen eigenen Methoden auf. Also, nein, es wäre unklug, jedes Mal eine neue Instanz zu erstellen. – BoltClock

+0

@BoltClock: guter Punkt. Ich werde expliziter über die Szenarien in [der andere Beitrag] (https://Stackoverflow.com/a/46420039) –

Verwandte Themen