MVVM Light : RelayCommand : define it lazy or in constructor?

試著忘記壹切 提交于 2020-01-01 12:16:25

问题


There are several examples on how to define a RelayCommand in the ViewModel:

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

Option 2 (in constructor)

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

What is the best / clearest design ?


回答1:


It really depends on what style you prefer. Most people don't like having a bunch of logic in property getters if they can avoid it.

Personally, I prefer having a real method to call instead of an anonymous method. My ViewModels look something like this.

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...
    }
}

Notice that if you're not using the enable command, you don't need to call the ctor overload that sets that.



来源:https://stackoverflow.com/questions/3433899/mvvm-light-relaycommand-define-it-lazy-or-in-constructor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!