Подтвердить что ты не робот

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

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

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

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

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

Как мне это сделать?

Спасибо!

Изменить -

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

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

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

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

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

4b9b3361

Ответ 1

Используя шаблон команды. В вашей модели просмотра:

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.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Вид

        <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();
            }
        }
    }