WPF复选框:检查更改的处理

Dav*_*vid 41 c# wpf checkbox

在WPF数据绑定中,我可以将IsChecked属性绑定到某些数据,例如用户设置,但我需要处理"CheckChanged"事件,我知道我可以单独处理Checked,Unchecked事件,但是有什么方法可以在此时收到通知价值改变了吗?

<CheckBox Content="Case Sensitive" IsChecked="{Binding bSearchCaseSensitive,
          Source={x:Static Properties:Settings.Default}}" />
Run Code Online (Sandbox Code Playgroud)

注意:我不在乎是否选中或未选中.我只是想在更改时收到通知.

nvo*_*igt 87

可以单独处理已检查和未检查的事件并不意味着您必须这样做.如果您不想遵循MVVM模式,您可以简单地将相同的处理程序附加到这两个事件,并且您有更改信号:

<CheckBox Checked="CheckBoxChanged" Unchecked="CheckBoxChanged"/>
Run Code Online (Sandbox Code Playgroud)

在代码隐藏中;

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

请注意,WPF强烈鼓励使用INotifyPropertyChanged和/或DependencyProperties的MVVM模式.这是可行的,而不是我想鼓励作为良好的编程习惯.


Fed*_*gui 13

我把它放在一个答案中,因为评论太长了:

如果您需要VM在CheckBox更改时知道,您应该真正绑定CheckBox到VM,而不是静态值:

public class ViewModel
{
    private bool _caseSensitive;
    public bool CaseSensitive
    {
        get { return _caseSensitive; }
        set
        {
            _caseSensitive = value;
            NotifyPropertyChange(() => CaseSensitive);

            Settings.Default.bSearchCaseSensitive = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML:

<CheckBox Content="Case Sensitive" IsChecked="{Binding CaseSensitive}"/>
Run Code Online (Sandbox Code Playgroud)

  • @David什么?如何在没有`INotifyPropertyChanged`的情况下处理WPF双向绑定?此外,这与示例无关,它就在那里,因为它是一个ViewModel属性.如果删除它,我的示例工作得很好. (3认同)
  • @HighScore,谢谢,这是一个解决方案,但对于我的情况而言,这太过分了。我不想诉诸INotifyPropertyChanged,这太麻烦了。:) (2认同)

Rob*_*Rob 13

作为复选框,单击=复选框更改以下内容也将起作用:

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

它具有工作的额外优势,IsThreeState="True"而只是处理Checked和Unchecked没有.

  • 对于禁用的控件以及使用键盘时,它确实具有正确的行为。此事件与一般的“状态更改”事件之间的显着区别是,以编程方式更改复选框后,该事件不会触发。 (2认同)

use*_*891 8

我知道这是一个古老的问题,但是Command如果使用MVVM 仅绑定到呢?

例如:

<CheckBox Content="Case Sensitive" Command="{Binding bSearchCaseSensitive}"/>
Run Code Online (Sandbox Code Playgroud)

对我来说,它会同时触发CheckUncheck


dow*_*for 0

Checked事件怎么样?将其与AttachedCommandBehaviors或类似的东西以及 DelegateCommand结合起来,以便每次调用该事件时都会在视图模型中触发一个函数。