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

Флажок WPF: проверка измененной обработки

В привязке данных WPF я могу привязать свойство IsChecked к некоторым данным, например. пользовательский параметр, но мне нужно обработать событие "CheckChanged", я знаю, что могу отдельно обрабатывать Проверено, Не отмеченное событие, но есть ли способ получить уведомление, когда это значение изменилось?

<CheckBox Content="Case Sensitive" IsChecked="{Binding bSearchCaseSensitive,
          Source={x:Static Properties:Settings.Default}}" />

Примечание. Мне все равно, проверено или не отмечено. Я просто хочу получать уведомления, когда он будет изменен.

4b9b3361

Ответ 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, чтобы делать то, что вы хотите.