如何使用MVVM模式"禁用"WPF中的按钮?

Ian*_*n P 21 c# wpf xaml .net-3.5

我正在努力掌握WPF和MVVM,并且取得了很好的进展.WPF和MVVM方面的进展顺利.

但是,XAML和数据绑定方面是另一个故事:)

我如何"禁用"按钮?

例如,我的视图模型中有一个CanClose属性,用于确定当前是否可以关闭应用程序.如果一个工作线程没有做某事,那么这个属性设置为false,我想要灰显按钮,或者通过某种绑定以某种方式在视觉上禁用关闭按钮.

我该怎么做呢?

谢谢!

编辑 -

太糟糕了我只能接受一个答案.

这两个答案对我帮助很大.在Kent的帖子中,他更进一步解释了为什么要在应用程序中实现命令基础结构,而不是按照我提出的方式禁用按钮:

如何使用MVVM模式"禁用"WPF中的按钮?

以及我原来问题的答案:

如何使用MVVM模式"禁用"WPF中的按钮?

Qua*_*ter 38

只需将Button 的IsEnabled属性绑定到CanClose即可:

<Button IsEnabled="{Binding CanClose}"/>
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,如果您采用 MVVM 方法并且正在使用命令及其 CanExecute 属性,根据 microsoft 文档,您不应该使用 IsEnabled 属性。它在文档中并标记为重要:https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/commanding (3认同)

Ken*_*art 34

通过使用命令模式.在您的视图模型中:

public class MyViewModel : ViewModel
{
    private readonly ICommand someCommand;

    public MyViewModel()
    {
        this.someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething);
    }

    public ICommand SomeCommand
    {
        get { return this.someCommand; }
    }

    private void DoSomething(object state)
    {
        // do something here
    }

    private bool CanDoSomething(object state)
    {
        // return true/false here is enabled/disable button
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的XAML中:

<Button Command="{Binding SomeCommand}">Do Something</Button>
Run Code Online (Sandbox Code Playgroud)

阅读这篇文章,了解更多关于DelegateCommand.


Aka*_*ava 10

如果返回ICommand的CanExecute值为false,则将禁用Button.因此,无论您的按钮绑定了什么命令,当您要禁用它时,查看是否可以返回CanExecute值false.