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

时间:2010-08-13 12:18:55

标签: c# wpf xaml .net-3.5

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

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

我如何“禁用”按钮?

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

我将如何做到这一点?

谢谢!

修改

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

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

How does one "disable" a button in WPF using the MVVM pattern?

我原来问题的答案:

How does one "disable" a button in WPF using the MVVM pattern?

5 个答案:

答案 0 :(得分:36)

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

<Button IsEnabled="{Binding CanClose}"/>

答案 1 :(得分:32)

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

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
    }
}

在您的XAML中:

<Button Command="{Binding SomeCommand}">Do Something</Button>

阅读this post以了解有关DelegateCommand

的更多信息

答案 2 :(得分:10)

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

答案 3 :(得分:1)

这也有效:

查看

        <Button>
            <Button.Style>
                <Style>
                    <Setter Property="Content" Value="Scream" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding btnEnabled}" Value="True">
                            <Setter Property="IsEnabled" Value="True" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>

<强>视图模型

    private bool _btnEnabled;
    public bool btnEnabled
    {
        get { return _btnEnabled; }
        set
        {
            if (_btnEnabled != value)
            {
                _btnEnabled = value;
                OnPropertyChanged();
            }
        }
    }

答案 4 :(得分:-1)

更改ViewModel文件:

公共布尔IsButtonEnabled {     得到{return _isButtonEnabled; }

set
{
    if (_isButtonEnabled == value)
    {
        return;
    }

    _isButtonEnabled = value;
    OnPropertyChanged("IsButtonEnabled");
}
}

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

XAML文件中Button的更改:IsEnabled =“ {Binding IsButtonEnabled}”