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

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

Тем не менее, XAML и привязка данных – это совершенно другая история 🙂

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

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

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

Спасибо!

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

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

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

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

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

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

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

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:

  

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

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

  

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

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

Вид :

   

ViewModel :

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