【问题标题】:Binding - disable break on property throw绑定 - 在属性抛出时禁用中断
【发布时间】:2016-05-30 19:24:31
【问题描述】:

使用异常验证

<TextBox>
    <Binding Path="Value"
             UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
            <ExceptionValidationRule />
        </Binding.ValidationRules>
    </Binding>
</TextBox>

对于这个属性

int _value = 1;
public int Value
{
    get { return _value; }
    set
    {
        if (value < 1)
            throw new ArgumentException();
        _value = value;
        OnPropertyChanged();
    }
}

如果我输入废话(例如1asdkfjlsdfTextBox 将得到一个红色边框。很好。

但是一旦我输入0,就会发生调试中断

我每次都必须点击调试栏上的继续

如果不进行调试,它会按预期工作:12093813asdf0 值的红色边框。

问题:如何防止这种中断?

我可以取消检查特定异常(屏幕截图上的箭头),但我希望在其他地方发生此异常时中断(例如,在某些方法中也抛出模型逻辑 ArgumentException)。我可以创建自己的异常,抛出它并取消选中它,但我对此也不满意。

【问题讨论】:

  • 我很困惑。你告诉它抛出异常,但是当它抛出异常时会感到不安?我认为您可能打算使用 ValidationResults。看看这个:msdn.microsoft.com/library/ms753962%28v=vs.100%29.aspx
  • @Khale_Kitha,点是随机输入(例如0983abcd)被绑定捕获,而0 进入属性,然后是突然的未处理异常。还没有考虑自定义验证规则,谢谢。虽然我不知道如何制作自己的ExceptionBinding,但我能自己捕获属性抛出的异常吗?你想通过展示如何做来节省我一些时间吗?
  • 我放在这里的东西太多了。将尝试发布可能有帮助的答案。

标签: c# wpf debugging exception binding


【解决方案1】:

随机输入被您的ExceptionValidationRule 捕获,因为0983abcd 不是整数。 (更多信息,在这里:https://msdn.microsoft.com/en-us/library/system.windows.controls.exceptionvalidationrule%28v=vs.110%29.aspx

当您发送随机废话时,它会导致 string->int 转换失败并触发 ExceptionValidationRule 为您的框着色。但是,当您发送 0 时,它会触发 您的 异常,该异常不在 try/catch (未处理)内,然后推送到通知先前异常并将框设置为红色的验证规则。

查看我的评论中的MSDN article,以获取有关如何执行第二个验证规则来检查您的&lt; 1 条件的一个很好的示例。 (您也可以将ExceptionvalidationRule 完全替换为它。)

查看答案on this post,了解为什么您的故障在调试之外不会导致崩溃。它被设计为优雅地失败,以防止简单的绑定问题造成更多麻烦。您仍然收到错误,但它只是对您隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多