所以说我有一个按钮(MyButton)绑定到:
public ICommand MyCommand { get; set; }
我用以下内容注册此命令:
MyCommand = new DelegateCommand<object>(DoSomething);
现在,如果我这样做
MyButton.IsEnabled = false;
它没有做任何事情,即按钮仍然启用。我知道该命令导致这种情况发生,因为如果我删除上面的新委托命令代码,则按钮将显示为禁用。
我的问题是:
1.有没有办法让我告诉这个绑定命令不要弄乱我的按钮的IsEnabled
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()。
一旦按钮使用命令,它就会被绑定。如果您愿意,可以通过更改它的可见性来隐藏按钮。