为什么RelayCommands通常使用延迟初始化?

时间:2010-09-22 13:53:00

标签: c# xaml mvvm data-binding lazy-initialization

当使用Josh Smith的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 个答案:

答案 0 :(得分:15)

实际上,WPF和Silverlight每次绑定只会获得一次relay命令,因此您根本不需要存储支持字段:

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

因此,尽管在你的建议中在.ctor中创建它没有任何问题,但是没有理由这样做。