显示消息框可防止 IsCheck 触发
本文关键字:IsCheck 触发 可防止 消息 显示 | 更新日期: 2023-09-27 17:55:18
我有几个绑定到单个CheckBox
的TextBoxes
。
这是与之关联的逻辑:
- 如果选中
Checkbox
,它将覆盖关联TextBoxes
中的任何现有文本并使其成为"0"++ - 如果所有
TextBoxes
的得分均为"0",则CheckBox
应禁用并选中。 - 如果任何
TextBoxes
从"0"更改,它将变为已启用和未选中。
++ *注意:* 需要注意的是,如果TextBox
的值为"C"。
好的,所以我遇到的问题是,当其中一个关联的TextBoxes
的值为"C"时,实现上面的警告。我希望发生的是遍历TextBoxes
并检查是否有任何得分为"C"。 如果找到一个,则向用户显示一条警告消息,确认他们是否要继续。 如果选择"是",则所有相关分数都将覆盖为"0"。如果选择"否",则应取消Checked
事件。
为此,我为 CheckBox.PreviewMouseDown
和 CheckBox.Checked
事件添加了事件侦听器。 这是我的CheckBox.PreviewMouseDown
事件侦听器的代码:
private void NormalCheckBoxControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
CheckBox normalCheckBox = (CheckBox)sender;
bool showCorrespondingScoreWarningMsg = false;
//Get a Row to loop through the AssociatedAdqScore controls for each
ScoreControl tempScoreControl = new ScoreControl();
foreach (ScoreControl score in this.ScoreControlList)
{
if (score.ScoreTextBox.Text == "C")
{
showCorrespondingScoreWarningMsg = true;
}
}
if (showCorrespondingScoreWarningMsg)
{
MessageBoxResult msgResult = InformationBox.Show("WARNING: Proceeding will remove corresponding 'C' scores. Continue?", "Continue?", ButtonStyle.YesNo, IconStyle.Question);
if (msgResult == MessageBoxResult.No)
{
e.Handled = true;
}
}
}
如果用户选择"否",这有效,但是我遇到的问题是,当选择"是"时,CheckBox.Checked
事件仍然不会被触发。 我尝试手动设置CheckBox.IsChecked = true;
如果if (msgResult == MessageBoxResult.Yes)
,但这会破坏绑定,因此这不是一个可行的解决方案。
如果用户选择"是",有什么方法可以解决此问题并继续NormalCheckBoxControl_Checked(object sender, RoutedEventArgs e)
事件?
我不知道"已检查"事件,尽管有一个CheckedChanged
事件和一个CheckStateChanged
事件。我习惯了.NET 2.0,所以这可能是3.0+的东西。无论哪种方式,我想我已经在这样的实例中手动调用了事件处理程序,没有任何问题。
您可以使用空参数(或已知对象和新事件参数)手动调用事件处理程序:
NormalCheckBoxControl_Checked(null, null);
或
NormalCheckBoxControl_Checked(new object, new EventArgs());
这应该手动启动您的例程,除非您需要它们,否则提供虚拟参数真的没有问题。无需引发事件并等待它冒泡,只需调用例程即可。
当然,如果还有其他例程依赖于事件冒泡,或者同一事件有多个处理程序,那么它可能会给您带来问题。请注意这一点,以防万一。