MVVM Light: RelayCommand: определить это лениво или в конструкторе? - PullRequest
4 голосов
/ 08 августа 2010

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

Опция 1 ( lazy ):

/// <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;}

Каков наилучший / четкий дизайн?

1 Ответ

10 голосов
/ 08 августа 2010

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

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

...