【问题标题】:Button always in disabled state按钮始终处于禁用状态
【发布时间】:2015-02-06 16:12:55
【问题描述】:

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

<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

【问题讨论】:

  • 您在这里使用的是什么 RelayCommand 版本?这是你自己的自定义类吗?
  • @RohitVats 不,它来自 MVVM 基础项目。见:mvvmfoundation.codeplex.com/SourceControl/latest#MvvmFoundation/…
  • 唯一的原因是 CanExecute 委托为 DoSomethingCoolCommand 返回 false 但您没有提供该委托。所以,它应该永远是真的。这是完整的代码吗?您是否有 CanExecute 委托或者您是否为应用程序中的按钮定义了一些默认模板?
  • 是否启用了父级?
  • 如果是小的,pastebin 会很好 或者一些到 Dropbox 的链接,gitHub 也很好。

标签: c# wpf mvvm binding mvvm-foundation


【解决方案1】:

您是否检查过任何 Buttons 父级是否处于禁用状态?这也会禁用所有子控件。

附注:

您似乎从未调用过CommandManager.InvalidateRequerySuggested(),并且它没有在RelayCommand´ class, just the registration of events, as seen [here][1]. ICommand or RelayCommand never does invalidate update it's state by default. You got to do this. Either by callingCommandManager.InvalidateRequerySuggested()` 中实现,这将建议重新查询所有已注册的命令(由于按钮1 中的操作,可能会影响许多其他命令。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2019-08-21
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多