Как «отключить» кнопку в WPF с помощью шаблона MVVM? - PullRequest
20 голосов
/ 13 августа 2010

Я пытаюсь понять WPF и MVVM и добился хорошего прогресса.Со стороны WPF и MVVM дела идут хорошо.

Тем не менее, сторона XAML и привязки данных - это совсем другая история:)

Как мне поступить с "отключением" кнопки?

Например, в моей модели представления есть свойство CanClose, которое определяет, можно ли в данный момент закрыть приложение.Если рабочий поток выключен, что-то делает, то для этого свойства установлено значение false, и я бы хотел либо серым цветом выделить кнопку, либо каким-то образом визуально отключить кнопку «Закрыть» с помощью какого-либо связывания.

Как мне поступитьо том, как это сделать?

Спасибо!

Редактировать -

Жаль, я могу принять только один ответ.

Эти два ответаочень помог мне.В посте Кента он сделал еще один шаг, объяснив, почему вы должны внедрить командную инфраструктуру в свое приложение вместо того, чтобы отключать кнопку так, как я спросил:

Как можно «отключить»кнопка в WPF с использованием шаблона MVVM?

И ответ на мой оригинальный вопрос:

Как можно «отключить» кнопку в WPF с использованием шаблона MVVM?

Ответы [ 4 ]

36 голосов
/ 13 августа 2010

Просто привяжите IsEnabled свойства Button к CanClose:

<Button IsEnabled="{Binding CanClose}"/>
32 голосов
/ 13 августа 2010

Путем использования шаблона команды.На ваш взгляд модель:

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>

Прочитайте этот пост , чтобы узнать больше о DelegateCommand.

10 голосов
/ 13 августа 2010

Если вы вернете CanExecute из ICommand значение false, кнопка будет отключена.Поэтому, к какой бы команде ни была привязана ваша кнопка, посмотрите, можете ли вы вернуть CanExecute значение false, если хотите отключить его.

1 голос
/ 06 мая 2016

Это тоже работает:

View

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

ViewModel

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