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

3

假设我有一个按钮(MyButton),它绑定到:

public ICommand MyCommand { get; set; }

我使用以下方式注册这个命令:

MyCommand = new DelegateCommand<object>(DoSomething);

现在,如果我执行以下操作:
MyButton.IsEnabled = false;

它什么也没做,即按钮仍处于启用状态。我知道这个命令导致了这种情况,因为如果我删除上面的新委托命令代码,那么按钮就会变成禁用状态。

我的问题是:
1. 有没有办法告诉我如何绑定一个命令,而不会影响我的按钮的IsEnabled属性?
2. 是否有一种只通过命令属性来改变可见性的方法(这可能是更正确的方式)

谢谢!


我可以通过添加另一个名为IsMyButtonEnabled的布尔属性来实现绑定到按钮的操作。但这种方式似乎有些低端。还有其他方法吗? - Shai UI
2个回答

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();
}

这与我的绑定到一个isEnabled布尔值没有太大的区别。 - Shai UI
在实践中,命令模式封装了这样一个概念:并非总是能执行命令。这是一个相当常见的概念,因此总体上该模式运作良好。如果你来自于 WinForms(我也是),起初可能会感到困难,但它确实很有道理。其附加好处是单元测试变得更容易,因为你不再需要像“isButtonEnabled”这样的UI概念,而只需一条命令和逻辑,你可以测试以确保命令能否根据预期状态执行。 - Tim Lloyd
好的,我明白了,感谢您详细的解释。最后一个问题。 如果DoSomething是一个方法,那么执行executeMethod: delegate { DoSomething; }会出现语法错误。 - Shai UI
1
@Shnitzel 我随意编写了代码,现在确保它可以编译。字符。:) - Tim Lloyd
啊,找不到CommandManager,我还在努力找它在哪里...顺便说一下,我正在使用Silverlight...嗯嗯 - Shai UI

1

您需要使用命令对象的 CanExecute 事件,并将逻辑移动到命令对象本身。这将被检查以确定按钮是否已启用。您可以阅读msdn ICommand文档进一步了解此功能。确保在发生导致状态更改的情况时调用CanExecuteChanged()。

一旦一个按钮使用了命令,它就与之绑定了。如果您喜欢,仍然可以通过更改其可见性来隐藏该按钮。


这个问题有点奇怪?我只希望它显示为禁用状态。我应该移动什么逻辑?这应该只是一个简单的一行代码,除了 RTFM 以外还有什么提示吗? - Shai UI
可以是一行简单的“return false;”。它只需要在您的命令对象中,该对象具有名为CanExecute()的函数。命令基本上是这样做的:MyButton.IsEnabled = MyCommand.CanExecute()希望这可以解释清楚它。 - Ryan from Denver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接