按钮始终处于禁用状态

问题描述 投票:0回答:1

我的视图上有一个带有简单命令绑定的按钮:

<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

c# wpf mvvm binding mvvm-foundation
1个回答
0
投票

您是否检查过是否有任何按钮父级的状态为禁用?这也会禁用所有子控件。

旁注:

你似乎从来没有调用过

CommandManager.InvalidateRequerySuggested()
,并且它没有在
RelayCommand
类中实现,只是事件的注册,如here所示。默认情况下,ICommand 或 RelayCommand 永远不会使其状态更新无效。你必须这样做。通过调用
CommandManager.InvalidateRequerySuggested()
,这将建议重新查询所有已注册的命令(因为按钮 1 中的操作可能会影响许多其他命令。

例如,可能有一个

IsProcessing
属性,当它的值更改时,您可以调用
CommandManager.InvalidateRequerySuggested()
来更新所有其他命令的状态。

© www.soinside.com 2019 - 2024. All rights reserved.