WPF Check box: Check changed handling

后端 未结 6 752
忘掉有多难
忘掉有多难 2020-12-01 13:33

In WPF data binding, I can bind the IsChecked property to some data, e.g. user setting, but I need to handle \"CheckChanged\" event, I know I can seperately handle <

相关标签:
6条回答
  • 2020-12-01 14:07

    Im putting this in an answer because it's too long for a comment:

    If you need the VM to be aware when the CheckBox is changed, you should really bind the CheckBox to the VM, and not a static value:

    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}"/>
    
    0 讨论(0)
  • 2020-12-01 14:11

    That you can handle the checked and unchecked events seperately doesn't mean you have to. If you don't want to follow the MVVM pattern you can simply attach the same handler to both events and you have your change signal:

    <CheckBox Checked="CheckBoxChanged" Unchecked="CheckBoxChanged"/>
    

    and in Code-behind;

    private void CheckBoxChanged(object sender, RoutedEventArgs e)
    {
      MessageBox.Show("Eureka, it changed!");
    }
    

    Please note that WPF strongly encourages the MVVM pattern utilizing INotifyPropertyChanged and/or DependencyProperties for a reason. This is something that works, not something I would like to encourage as good programming habit.

    0 讨论(0)
  • 2020-12-01 14:16

    What about the Checked event? Combine that with AttachedCommandBehaviors or something similar, and a DelegateCommand to get a function fired in your viewmodel everytime that event is called.

    0 讨论(0)
  • A simple and proper way I've found to Handle Checked/Unchecked events using MVVM pattern is the Following, with Caliburn.Micro :

     <CheckBox IsChecked="{Binding IsCheckedBooleanProperty}" Content="{DynamicResource DisplayContent}" cal:Message.Attach="[Event Checked] = [Action CheckBoxClicked()]; [Event Unchecked] = [Action CheckBoxClicked()]" />
    

    And implement a Method CheckBoxClicked() in the ViewModel, to do stuff you want.

    0 讨论(0)
  • 2020-12-01 14:18

    As a checkbox click = a checkbox change the following will also work:

    <CheckBox Click="CheckBox_Click" />
    
    private void CheckBox_Click(object sender, RoutedEventArgs e)
    {
        // ... do some stuff
    }
    

    It has the additional advantage of working when IsThreeState="True" whereas just handling Checked and Unchecked does not.

    0 讨论(0)
  • 2020-12-01 14:22

    I know this is an old question, but how about just binding to Command if using MVVM?

    ex:

    <CheckBox Content="Case Sensitive" Command="{Binding bSearchCaseSensitive}"/>
    

    For me it triggers on both Check and Uncheck.

    0 讨论(0)
提交回复
热议问题