Как отключить кнопку в WPF с использованием шаблона MVVM?
Я пытаюсь понять WPF и MVVM и добился хороших результатов. В WPF и MVVM стороны идут хорошо.
Однако сторона XAML и привязка данных - это совершенно другая история:)
Как я могу "отключить" кнопку?
Например, у меня есть свойство CanClose в моей модели просмотра, которое определяет, может ли приложение в настоящее время закрываться. Если рабочий поток отключен от выполнения какого-либо действия, тогда для этого свойства установлено значение false, и я хотел бы либо отменить кнопку, либо каким-либо образом визуально отключить кнопку "Закрыть" с помощью какого-то привязки.
Как мне это сделать?
Спасибо!
Изменить -
Жаль, что я могу принять только один ответ.
Эти два ответа очень помогли мне. В сообщении Kent он сделал еще один шаг, объяснив, почему вы должны внедрять инфраструктуру команд в своем приложении, а не отключать кнопку так, как я спросил:
Как отключается и отключается? кнопку в WPF с использованием шаблона MVVM?
И ответ на мой оригинальный вопрос:
Как отключается "отключить" кнопку в WPF с использованием шаблона MVVM?
Ответы
Ответ 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();
}
}
}