Я пытаюсь понять WPF и MVVM и добился хорошего прогресса. Со стороны WPF и MVVM дела идут хорошо.
Однако, сторона XAML и привязки данных - это совсем другая история:)
Как бы я пошел по поводу «отключения» кнопки?
Например, я в моей модели просмотра есть свойство CanClose, которое определяет, может ли приложение быть закрыто в данный момент. Если рабочий поток не работает, тогда это свойство имеет значение false, и я хотел бы либо серым цветом кнопку, либо как-то визуально отключить кнопку «Закрыть» с помощью какого-либо связывания.
Как бы я поступил так?
Спасибо!
Редактировать -
Жаль, что я могу принять только один ответ.
Эти два ответа мне очень помогли. В публикации Кента он пошел дальше, объяснив, почему вы должны внедрить командную инфраструктуру в свое приложение вместо того, чтобы отключать кнопку так, как я спросил:
Как «отключить» кнопку в 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:
<Button Command="{Binding SomeCommand}">Do Something</Button>
Прочтите этот пост , чтобы узнать больше о DelegateCommand
.
Просто привяжите свойство IsEnabled кнопки к CanClose:
<Button IsEnabled="{Binding CanClose}"/>
Если вы вернете CanExecute для ICommand значение false, кнопка будет отключена. Итак, какая бы команда ни была связана с вашей кнопкой, посмотрите, можете ли вы вернуть CanExecute значение false, если хотите ее отключить.