Почему RelayCommands обычно используют отложенную инициализацию? - PullRequest
13 голосов
/ 22 сентября 2010

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

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, поэтому я не вижу причины использовать этот метод для настройки параметров в конструкторе.

Я что-то здесь упускаю?

1 Ответ

15 голосов
/ 22 сентября 2010

На самом деле, WPF и Silverlight получают команду relay только один раз за привязку, поэтому вам вообще не нужно хранить поле поддержки:

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

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

...