显示MessageBox可防止触发IsChecked

时间:2013-01-21 20:43:45

标签: c# binding checkbox

我有几个TextBoxes绑定到一个CheckBox

这是与之相关的逻辑:

  • 如果选中Checkbox,则会覆盖关联的TextBoxes中的所有现有文字并将其设为'0' ++
  • 如果TextBoxes的所有分数都为'0',则CheckBox应该为{0} 被禁用并检查。
  • 如果TextBoxes中的任何一个从“0”改变,那么它将成为 启用和取消选中。

++ * 注意: *如果TextBox的值为'C',则需要注意。

好的,所以我遇到的问题是在关联TextBoxes之一的值为'C'时执行上述警告。我想要发生的是循环TextBoxes并检查是否有任何得分'C'。如果找到一个,则向用户显示警告消息,确认是否要继续。如果选择是,则所有相关分数将被覆盖为“0”。如果选择“否”,则应取消Checked事件。

为实现此目的,我为CheckBox.PreviewMouseDownCheckBox.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 if (msgResult == MessageBoxResult.Yes),但这会破坏绑定,因此这不是一个可行的解决方案。

如果用户选择“是”,我有什么方法可以解决此问题并继续NormalCheckBoxControl_Checked(object sender, RoutedEventArgs e)事件。

1 个答案:

答案 0 :(得分:1)

我不知道“已检查”事件,但有CheckedChanged事件和CheckStateChanged事件。我已经习惯了.NET 2.0,所以这可能是3.0+。无论哪种方式,我认为我已经在这样的实例中手动调用事件处理程序而没有任何问题。

您可以使用null params(或已知对象& new event args)手动调用事件处理程序:

NormalCheckBoxControl_Checked(null, null);

NormalCheckBoxControl_Checked(new object, new EventArgs());

这应该手动启动你的日常工作,除非你需要它们,否则提供虚拟参数确实没有问题。无需提出事件并等待它冒泡,只需调用例程。

当然,如果还有其他依赖事件冒泡的例程,或者如果同一事件有多个处理程序,那么它可能会导致问题。请注意,以防万一。