如果没有当前项目,如何禁用绑定到当前项目的ICommand的按钮?

9 .net c# wpf binding mvvm

假设您有一个按钮,其command属性绑定到ICommand某些集合的当前项目.

当集合是null,按钮保持启用状态,单击它似乎是一个无操作.我希望该按钮保持禁用状态.我想出了以下内容,以便在集合为空时保持按钮被禁用.不过,看来的东西,可能有点太令人费解或许在这样一个更自然的,更简单,更MVVM来完成.

因此,问题是:是否有一种更简单的方法可以禁用该按钮,理想情况下不使用代码隐藏?

的.xaml:

<Button Content="Do something" >
    <Button.Command>
        <PriorityBinding>
            <Binding Path="Items/DoSomethingCmd"  />
            <Binding Path="DisabledCmd" />
        </PriorityBinding>
    </Button.Command>
</Button>
Run Code Online (Sandbox Code Playgroud)

的.cs:

public class ViewModel : NotificationObject
{
    ObservableCollection<Foo> _items;

    public DelegateCommand DisabledCmd { get; private set; }

    public ObservableCollection<Foo> Items { 
        get { return _items; } 
        set { _items = value; RaisePropertyChanged("Items"); } 
    }

    public ViewModel()
    {
        DisabledCmd = new DelegateCommand(DoNothing, CantDoAnything);
    }

    void DoNothing() { }
    bool CantDoAnything()
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

几个笔记:

  1. 知道我可以使用lambda表达式,但在这个示例代码中我没有.
  2. 知道谓词是什么.
  3. 我没有看到做什么事情DoSomethingCmd.CanExecute会做任何事情来帮助,因为DoSomethingCmd没有当前项目时无法访问.
  4. 所以我会重新集中我的问题:我怎样才能避免使用DisabledCmd?我并不感兴趣,DoSomethingCmd因为它不是我想要的.否则我不会问这个问题.

另一个编辑:

所以我基本上采用了这个答案作为解决方案:WPF/MVVM:当UserControl后面的ViewModel尚未初始化时,禁用Button的状态?

我相信,这正是hbarck提出的建议.

hba*_*rck 6

我做的类似于akjoshi,只有我使用普通的Trigger而不是DataTrigger,我会检查Button.Command为null.因为禁用没有Command的Button总是有意义的(特别是在MVVM中,没有click事件处理程序),所以将这个触发器包含在Buttons的默认样式中也是一个好主意,以便具有这种行为在整个应用程序的所有按钮上...我没有看到使用虚拟命令的理由.