Вопрос: MVVM Light: RelayCommand: определить его ленив или в конструкторе?


Существует несколько примеров того, как определить RelayCommand  в ViewModel :

Опция 1 ( ленивый ):

/// <summary>
/// Gets the LogOnCommand.
/// </summary>
/// <value>The LogOnCommand.</value>
public RelayCommand<LogOnUser> LogOnCommand
{
    get
    {
        if (this.logOnCommand == null)
        {
            this.logOnCommand = new RelayCommand<LogOnUser>(
                action =>
                {
                    // Action code...
                },
                g => g != null);
        }

        return this.logOnCommand;
    }
}

Вариант 2 (в конструктор)

/// <summary>
/// Initializes a new instance of the <see cref="LogOnFormViewModel"/> class.
/// </summary>
public LogOnFormViewModel()
{
    this.logOnCommand = new RelayCommand<LogOnUser>(
                action =>
                {
                    // Action code...
                },
                g => g != null);
}

/// <summary>
/// Gets the LogOnCommand.
/// </summary>
/// <value>The LogOnCommand.</value>
public RelayCommand<LogOnUser> LogOnCommand {get; private set;}

Каков наилучший / ясный дизайн?


4


источник


Ответы:


Это зависит от того, какой стиль вы предпочитаете. Большинство людей не любят иметь кучу логики в свойствах, если они могут избежать этого.

Лично я предпочитаю иметь реальный метод для вызова вместо анонимного метода. Мои ViewModels выглядят примерно так.

public class MyViewModel : ViewModelBase
{
    public RelayCommand<CommandParam> MyCommand { get; private get; }

    public MyViewModel()
    {
        CreateCommands();
    }

    private void CreateCommands()
    {
        MyCommand = new RelayCommand<CommandParam>(MyCommandExecute);
    }

    private void MyCommandExecute(CommandParam parm)
    {
        // Action code...
    }
}

Обратите внимание: если вы не используете команду enable, вам не нужно вызывать перегрузку ctor, которая устанавливает это.


10