我的视图上有一个带有简单命令绑定的按钮:
<Window ...>
<Window.DataContext>
<vm:ShellViewModel />
</Window.DataContext>
...
<Button Command="{Binding DoSomethingCoolCommand}" Content="Execute" />
还有虚拟机:
public class ShellViewModel : ObservableObject {
private RelayCommand _doSomethingCoolCommand;
public ICommand DoSomethingCoolCommand {
get {
return _doSomethingCoolCommand ??
(_doSomethingCoolCommand = new RelayCommand(DoSomethingCool));
}
}
private void DoSomethingCool() { ... }
但是,该按钮在应用程序/视图启动时被禁用,并且我无法启用它。我尝试将命令执行评估传递给
RelayCommand
并在视图上设置 IsEnabled
。我是不是错过了什么?
编辑
RelayCommand 和 ObservableObject 来自 mvvm Foundation 项目,如标签中所述。链接:https://mvvmfoundation.codeplex.com
您是否检查过是否有任何按钮父级的状态为禁用?这也会禁用所有子控件。
旁注:
你似乎从来没有调用过
CommandManager.InvalidateRequerySuggested()
,并且它没有在RelayCommand
类中实现,只是事件的注册,如here所示。默认情况下,ICommand 或 RelayCommand 永远不会使其状态更新无效。你必须这样做。通过调用 CommandManager.InvalidateRequerySuggested()
,这将建议重新查询所有已注册的命令(因为按钮 1 中的操作可能会影响许多其他命令。
例如,可能有一个
IsProcessing
属性,当它的值更改时,您可以调用 CommandManager.InvalidateRequerySuggested()
来更新所有其他命令的状态。