在ViewModel中创建一个新的ICommand对象

时间:2011-09-09 16:04:49

标签: wpf binding refresh viewmodel icommand

两个ICommand对象都绑定到ViewModel。

第一种方法似乎经常被使用。

但是第二个保存了一些代码行,但是当刷新Binding时它不会每次都创建一个新的ICommand对象,因此浪费资源?!

private LightCommand _deleteDocumentCommand;
        public LightCommand DeleteDocumentCommand
        {
            get { return _deleteDocumentCommand ?? (_deleteDocumentCommand = new LightCommand(() => DeleteDocument(), () => CanDeleteDocument)); }
        }

        public LightCommand DeleteDocumentCommand
        {
            get { return new LightCommand(() => DeleteDocument(), () => CanDeleteDocument); }
        }

3 个答案:

答案 0 :(得分:1)

是的,你的第二种方法在每次引用命令时都会创建一个新命令,但我也发现你的第一种方法很难阅读。

我在ViewModel中创建命令的首选方法是

private LightCommand _deleteDocumentCommand;
public LightCommand DeleteDocumentCommand
{
    get 
    {
        if (_deleteDocumentCommand == null)
        {
            _deleteDocumentCommand = new LightCommand(
                () => DeleteDocument(), () => CanDeleteDocument);
        }

        return _deleteDocumentCommand;
    }
}

它可能是更多代码行,但它易于阅读和理解。此外,通常我的所有公共属性/命令都是由宏生成并转储到#region Properties区域,在我使用ViewModel的整个过程中保持折叠,所以我不必滚动浏览get / set方法的页面

答案 1 :(得分:0)

是的,是的。最好先将它实例化一次,这样就可以得到类似的结果:

LightCommand DeleteCommand { get;  set;}

然后在我们分配给它的VM实例中。或者你可以使用你的第一个例子。

答案 2 :(得分:0)

我假设您正在寻找验证,这是正确的:

每次刷新Binding(或调用命令)时,都会实例化一个新对象。这似乎是对资源的明显浪费。