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

时间:2013-03-18 15:16:34

标签: c# wpf checkbox

在WPF数据绑定中,我可以将IsChecked属性绑定到某些数据,例如用户设置,但我需要处理“CheckChanged”事件,我知道我可以单独处理 已检查 未经检查 事件,但有什么方法可以在更改此值时收到通知吗?

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

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

6 个答案:

答案 0 :(得分:82)

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

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

和代码隐藏;

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

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

答案 1 :(得分:12)

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

如果您需要在更改CheckBox时知道VM,您应该将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}"/>

答案 2 :(得分:10)

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

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

它具有在IsThreeState="True"时工作的额外优势,而只是处理Checked和Unchecked不会。

答案 3 :(得分:4)

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

例如:

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

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

答案 4 :(得分:0)

Checked事件怎么样?将其与AttachedCommandBehaviors或类似的东西相结合,并使用DelegateCommand将每次调用该事件时在viewmodel中触发一个函数。

答案 5 :(得分:0)

我发现使用MVVM模式处理已检查/未检查事件的简单而正确的方法是使用Caliburn.Micro进行以下操作:

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

并在ViewModel中实现方法CheckBoxClicked(),以执行所需的操作。