2013-03-18 80 views
25

在WPF数据绑定中,我可以将IsChecked属性绑定到某些数据,例如,用户设置,但我需要处理“CheckChanged”事件,我知道我能应付seperately 经过未选中事件,但有什么办法,当该值更改为得到通知?WPF复选框:检查更改的处理

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

注意:我不关心它是否被选中或未选中。我只是想在它发生变化时得到通知。

+1

你想要什么?你为什么不将'IsChecked'属性绑定到ViewModel中的某些内容并对该属性做出反应? UI不是数据。 – 2013-03-18 15:20:52

+0

它已经绑定到用户设置。 UI不是数据,这与提出的问题有关吗? – David 2013-03-18 15:22:24

+2

我的观点是,如果ViewModel在更改时需要知道,则应该将其绑定到ViewModel,而不是静态的,然后从VM内部可以更改静态值。 – 2013-03-18 15:26:00

回答

0

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

+0

正如在问题中所评论的,我不想使用Checked /未经检查的事件处理程序,我关心的是“已更改”信号。 – David 2013-03-18 15:24:33

8

林把这个在回答中,因为它是一个评论太长:

如果你需要的虚拟机时的CheckBox改变要知道,你真的应该绑定CheckBox到虚拟机,而不是静态的值:

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}"/> 
+1

@HighScore,谢谢,这是一个解决方案,但对我的情况矫枉过正。我不想诉诸INotifyPropertyChanged,它太麻烦了。 :) – David 2013-03-18 15:35:38

+2

@大卫什么?你如何处理没有INotifyPropertyChanged的WPF双向绑定?此外,这与示例无关,只是因为它是ViewModel属性。我的例子工作得很好,如果你删除它。 – 2013-03-18 15:37:12

+1

确实如此,这是双向绑定。该设置可以被读取和写入,遗憾的是我没有通知设置者改变。 – David 2013-03-18 15:54:44

61

那你可以^h并且选中和未选中的事件分别并不意味着你要必须。如果你不想遵循MVVM模式,你可以简单地附上相同的处理这两个事件,你有你的改变信号:

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

,并在代码隐藏;

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

请注意,WPF大力鼓励利用INotifyPropertyChanged的和/或DependencyProperties的一个原因MVVM模式。这是有用的,不是我想鼓励的良好编程习惯。

4

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

例如:

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

对于我来说,触发双方CheckUncheck

5

为复选框点击=复选框更改以下也将工作:

<CheckBox Click="CheckboxClicked" /> 
Private Sub CheckboxClicked(sender As Object, e As System.Windows.RoutedEventArgs) 
    '.... do some stuff 
End Sub 

它工作的额外优势,当IsThreeState =“真”,而只是处理经过和未检查不。

+0

如果复选框被禁用,但是您单击它,会发生什么情况?我猜这个事件还在发生,这不是所期望的行为,大部分时间 – 2017-05-12 08:36:27

+0

这不应该发生。如果它被禁用,点击事件也将被禁用。 – Expenzor 2017-07-22 13:48:48