Silverlight / WPF:我不希望ICommand更改Button的IsEnabled属性,这可能吗?

时间:2010-07-21 19:37:28

标签: c# wpf silverlight mvvm

所以说我有一个按钮(MyButton)绑定到:

public ICommand MyCommand { get; set; }

我用以下内容注册此命令:

MyCommand = new DelegateCommand<object>(DoSomething);

现在,如果我这样做

MyButton.IsEnabled = false;

它没有做任何事情,即按钮仍然启用。我知道该命令导致这种情况发生,因为如果我删除上面的新委托命令代码,则按钮将显示为禁用。

我的问题是:
1.有没有办法让我告诉这个绑定命令不要弄乱我的按钮的IsEnabled
2.有没有办法通过命令属性改变可见性(这可能是更正确的方式)

谢谢!

2 个答案:

答案 0 :(得分:3)

您需要在CanExecute委托的命令中添加逻辑,例如:

ICommand comand = new DelegateCommand<object>
    (
    executeMethod: delegate { DoSomething(); }
    ,
    canExecuteMethod: delegate { return _buttonEnabled; }
    );

_buttonEnabled = false;

CommandManager.InvalidateRequerySuggested();

_buttonEnabled = true;

CommandManager.InvalidateRequerySuggested();

“_buttonEnabled”变量应该真正代表应用程序的状态,该状态控制是否应该实际启用或禁用按钮。例如,它可能是“_isSomethingDone”,并且根据应用程序的状态为true \ false。这将禁用您的按钮,而“DoSomething”实际上正在做某事。

粗略的例子:

ICommand saveCommand = new DelegateCommand<object>
    (
    executeMethod: delegate { Save(); }
    ,
    canExecuteMethod: delegate { return _canSave; }
    );

private void Save()
{
    _canSave = false;

    CommandManager.InvalidateRequerySuggested();

    //do save...

    _canSave = true;

    CommandManager.InvalidateRequerySuggested();
}

答案 1 :(得分:1)

您需要使用命令对象的CanExecute事件,并将您的逻辑移动到命令对象本身。这将被检查以告知您的按钮是否已启用。您可以阅读msdn ICommand documentation以进一步了解此功能。每当出现导致状态发生变化的事情时,请务必调用CanExecuteChanged()。

一旦按钮使用命令,它就会被绑定。如果您愿意,可以通过更改它的可见性来隐藏按钮。