2010-09-22 8 views
12

Cuando se utiliza, la mayoría de los ejemplos que he visto el uso de inicialización perezosa de RelayCommand Josh Smith, tales como:¿Por qué RelayCommands suele utilizar la inicialización lenta?

public class ViewModel 
{ 
    private ICommand myCommand; 

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

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

} 

En lugar de crear el RelayCommand en el constructor, como esto:

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

    public ICommand MyCommand 
    { 
     get; 
     private set; 

    } 

    // ... stuff ... 
} 

¿Cuál es la beneficio de usar la inicialización perezosa aquí? Tendrá que invocar la propiedad get al configurar el enlace, por lo que no veo una razón para utilizar este método en la configuración del constructor.

¿Falta algo aquí?

+0

Tienes razón. La inicialización lenta de RoutedCommands no tiene ningún sentido porque son muy livianos y se cargan de todos modos tan pronto como la Vista se adhiere a él. – jbe

Respuesta

15

En realidad, WPF y Silverlight obtendrán el mando del relé sólo una vez por la unión, por lo que no es realmente necesario para almacenar un campo respaldo en absoluto:

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

Así, mientras que no hay nada malo con la creación en el .ctor como sugieres, hay muy pocas razones para hacerlo.

+2

_ "WPF y Silverlight recibirán el comando de retransmisión una sola vez por vinculación" _ - Sé que en la práctica esto es cierto. Pero dado que la documentación no promete este comportamiento, ¿es realmente sensato crear un nuevo objeto cada vez que se recupera el valor de la propiedad? ¿Qué sucede ese día que Microsoft, por cualquier razón, decide que tiene más sentido dejar que su objeto modelo mantenga la referencia del objeto de comando en lugar de almacenarlo en caché en algún lugar, y solo obtienen el valor de la propiedad cada vez que lo necesitan? –

+2

@ Peter Duniho: no solo Microsoft; my view model llama sus comandos (y CanExecute()) directamente desde sus propios métodos todo el tiempo. Entonces, no, no sería prudente crear una nueva instancia cada vez. – BoltClock

+0

@BoltClock: buen punto. Seré más explícito sobre los escenarios en [la otra publicación] (https://stackoverflow.com/a/46420039) –

Cuestiones relacionadas