【问题标题】:Displaying a MessageBox prevents IsChecked from firing显示 MessageBox 可防止 IsChecked 触发
【发布时间】:2013-01-04 23:52:27
【问题描述】:

我有几个TextBoxes 绑定到一个CheckBox。

这是与之相关的逻辑:

  • 如果选中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;
        }
    }
}

This works if the user selects 'No,' however the issue I'm having is that when choosing 'Yes,' the CheckBox.Checked event still does not get fired.如果if (msgResult == MessageBoxResult.Yes),我尝试手动设置CheckBox.IsChecked = true;,但这会破坏绑定,因此这不是一个可行的解决方案。

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

【问题讨论】:

  • 为什么不将CheckBox 的IsChecked 属性绑定到某个属性?这样,当您将CheckBox.IsChecked 绑定到该属性时,您只需在TextBox 条件与您想要的匹配时更改该属性,当您更改该属性时,它会自动为您检查/取消选中您的CheckBox。

标签: c# binding checkbox


【解决方案1】:

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

您可以使用空参数(或已知对象和新事件参数)手动调用事件处理程序:

NormalCheckBoxControl_Checked(null, null);

或

NormalCheckBoxControl_Checked(new object, new EventArgs());

这应该手动启动您的例程,除非您需要它们,否则提供虚拟参数确实没有问题。无需引发事件并等待它冒泡,只需调用例程即可。

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

【讨论】:

  • 谢谢,我会看看手动启动活动是否对我有用。仅供参考 - 我的应用程序正在使用 .NET Framework 4.0,因此 CheckBox.Checked 可能直到 3.0+ 才添加
  • 我刚刚在 MSDN 上查看过,看起来 3.0 更改了事件名称。没什么大不了的,它应该仍然有效。我正在编写一个 WinForms 2.0 示例,看看是否可以。
  • 对事件侦听器中的逻辑进行了一些小的更新,调用NormalCheckBoxControl_Checked(null, null) 显式工作;谢谢!我不知道可以手动调用事件侦听器(更不用说能够使用null 参数调用它们!)而无需实际引发事件来触发它。
  • 很高兴它对你有用。请注意,可能存在竞争条件,不确定您的整个代码是如何工作的。只需确保在手动调用事件处理程序之前实际选中(或未选中)复选框。
  • 谢谢!我会记住这一点,但不应该存在竞争条件 - 唯一一次调用 NormalCheckBox_PreviewMouseDown() 是当用户在未选中时单击它(未选中通过绑定处理),所以如果 @ 987654329@ 事件未处理,应始终调用 NormalCheckBox_Checked()。
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多