Флажок WPF: проверка измененной обработки
В привязке данных WPF я могу привязать свойство IsChecked к некоторым данным, например. пользовательский параметр, но мне нужно обработать событие "CheckChanged", я знаю, что могу отдельно обрабатывать Проверено, Не отмеченное событие, но есть ли способ получить уведомление, когда это значение изменилось?
<CheckBox Content="Case Sensitive" IsChecked="{Binding bSearchCaseSensitive,
Source={x:Static Properties:Settings.Default}}" />
Примечание. Мне все равно, проверено или не отмечено. Я просто хочу получать уведомления, когда он будет изменен.
Ответы
Ответ 1
То, что вы можете обрабатывать проверенные и непроверенные события отдельно, не означает, что вам нужно. Если вы не хотите следовать шаблону MVVM, вы можете просто присоединить один и тот же обработчик к обоим событиям, и у вас есть сигнал изменения:
<CheckBox Checked="CheckBoxChanged" Unchecked="CheckBoxChanged"/>
и в Code-behind;
private void CheckBoxChanged(object sender, RoutedEventArgs e)
{
MessageBox.Show("Eureka, it changed!");
}
Обратите внимание, что WPF настоятельно рекомендует шаблон MVVM с использованием свойств INotifyPropertyChanged и/или DependencyProperties. Это то, что работает, а не то, что я хотел бы поощрять как хорошую привычку программирования.
Ответ 2
Я помещаю это в ответ, потому что он слишком длинный для комментария:
Если вам нужна виртуальная машина, чтобы знать, когда изменяется CheckBox
, вы действительно должны привязать CheckBox
к VM, а не статическую величину:
public class ViewModel
{
private bool _caseSensitive;
public bool CaseSensitive
{
get { return _caseSensitive; }
set
{
_caseSensitive = value;
NotifyPropertyChange(() => CaseSensitive);
Settings.Default.bSearchCaseSensitive = value;
}
}
}
XAML:
<CheckBox Content="Case Sensitive" IsChecked="{Binding CaseSensitive}"/>
Ответ 3
В качестве флажка нажмите = изменение флажка, следующие также будут работать:
<CheckBox Click="CheckBox_Click" />
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
// ... do some stuff
}
Он имеет дополнительное преимущество работы, когда IsThreeState="True"
тогда как просто обработка Checked и Unchecked - нет.
Ответ 4
Я знаю, что это старый вопрос, но как насчет привязки к Command
при использовании MVVM?
Пример:
<CheckBox Content="Case Sensitive" Command="{Binding bSearchCaseSensitive}"/>
Для меня это срабатывает как для Check
, так и Uncheck
.
Ответ 5
Как насчет события Checked? Объедините это с AttachedCommandBehaviors или что-то подобное, и DelegateCommand, чтобы получить функцию, запускаемую в вашей модели просмотра каждый раз, когда вызывается это событие.
Ответ 6
Простой и правильный способ обработки событий Checked/Unchecked с помощью шаблона MVVM - это Caliburn.Micro:
<CheckBox IsChecked="{Binding IsCheckedBooleanProperty}" Content="{DynamicResource DisplayContent}" cal:Message.Attach="[Event Checked] = [Action CheckBoxClicked()]; [Event Unchecked] = [Action CheckBoxClicked()]" />
И реализуйте метод CheckBoxClicked() в ViewModel, чтобы делать то, что вы хотите.