61

在 WPF 数据绑定中,我可以将 IsChecked 属性绑定到某些数据,例如用户设置,但我需要处理“CheckChanged”事件,我知道我可以单独处理CheckedUnchecked事件,但是有什么方法可以在这种情况下得到通知值变了?

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

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

4

6 回答 6

110

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

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

并在代码隐藏中;

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

请注意,出于某种原因,WPF 强烈鼓励使用 INotifyPropertyChanged 和/或 DependencyProperties 的 MVVM 模式。这是可行的,而不是我想鼓励的良好编程习惯。

于 2013-03-18T16:16:11.063 回答
31

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

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

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

于 2015-10-24T14:19:44.393 回答
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;
        }
    }
}

XAML:

<CheckBox Content="Case Sensitive" IsChecked="{Binding CaseSensitive}"/>
于 2013-03-18T15:31:43.207 回答
10

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

前任:

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

对我来说,它同时触发CheckUncheck

于 2014-10-03T21:31:54.923 回答
1

我发现使用 MVVM 模式处理已检查/未检查事件的一种简单而正确的方法如下,使用 Caliburn.Micro :

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

并在 ViewModel 中实现一个方法 CheckBoxClicked() 来做你想做的事情。

于 2019-05-27T07:28:10.763 回答
0

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

于 2013-03-18T15:20:51.100 回答