2010-09-22 3 views
12

При использовании, большинство примеров, которые я видел использовать ленивую инициализацию Джоша Смита RelayCommand такие как:Почему RelayCommands обычно используют ленивую инициализацию?

public class ViewModel 
{ 
    private ICommand myCommand; 

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

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

} 

Вместо того, чтобы создавать RelayCommand в конструкторе, как это:

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

    public ICommand MyCommand 
    { 
     get; 
     private set; 

    } 

    // ... stuff ... 
} 

Что такое польза от использования ленивой инициализации здесь? Он должен будет вызвать свойство get при настройке привязки, поэтому я не вижу причины использовать этот метод над настройками вещей в конструкторе.

Я что-то упустил?

+0

Вы правы. Ленивая инициализация RoutedCommands не имеет никакого смысла, потому что они очень легкие, и они загружаются в любом случае, как только View связывается с ним. – jbe

ответ

15

На самом деле, WPF и Silverlight получит команду реле только один раз в связывании, так что вам не нужно хранить поле подкладочный на всех:

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

Таким образом, хотя нет ничего плохого в его создании в как вы предлагаете, очень мало причин.

+2

_ «WPF и Silverlight получат команду реле только один раз за привязку» _ - Я знаю, на практике это правда. Но, учитывая, что в документации нет _promise_ этого поведения, действительно ли все разумно создавать новый объект каждый раз, когда извлекается значение свойства? Что происходит в тот день, когда Microsoft по какой-либо причине решает, имеет смысл, чтобы ваш объект модели сохранял ссылку на объект команды, а не кешировал ее где-то, и они просто получают значение из свойства каждый раз, когда это необходимо? –

+2

@Peter Duniho: не только Microsoft; моя модель просмотра вызывает свои команды (и CanExecute()) непосредственно из своих собственных методов все время. Итак, нет, было бы неразумно каждый раз создавать новый экземпляр. – BoltClock

+0

@BoltClock: хорошая точка. Я буду более откровенен в отношении сценариев в [другом сообщении] (https://stackoverflow.com/a/46420039) –

Смежные вопросы