在WPF数据绑定中,我可以将IsChecked属性绑定到某些数据,例如用户设置,但我需要处理“CheckChanged”事件,我知道我可以单独处理 已检查 , 未经检查 事件,但有什么方法可以在更改此值时收到通知吗?
<CheckBox Content="Case Sensitive" IsChecked="{Binding bSearchCaseSensitive,
Source={x:Static Properties:Settings.Default}}" />
注意:我不在乎是否选中或未选中。我只想在更改时收到通知。
答案 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}"/>
对我来说,它会同时触发Check
和Uncheck
。
答案 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(),以执行所需的操作。