【问题标题】:How to propagate errors & exceptions that occur during WPF data binding?如何传播 WPF 数据绑定期间发生的错误和异常?
【发布时间】:2009-04-22 08:25:58
【问题描述】:

我经常发现我不小心破坏了应用程序中的数据绑定。通过重命名属性而不是在 XAML 中重命名它,或者属性由于某种原因引发异常。

默认情况下,数据绑定错误会记录到调试输出中,抛出的异常会被捕获和抑制。

有没有一种简单的方法可以在调试输出记录后引发异常?

我想尽快知道数据绑定是否被破坏(最好是在自动化测试中发现),并且不要冒在人工测试之前可能被忽视的风险。

【问题讨论】:

    标签: c# wpf data-binding xaml


    【解决方案1】:

    经过一番拖延后,我终于着手编写解决方案来解决我最初的问题。

    我的解决方案使用自定义的TraceListener(最初由 John 建议)记录到输出窗口。发生错误时,输出窗口会自动显示并放到前台。

    这是我的TraceListener

    public class ErrorLogTraceListener : TraceListener
    {
        public override void Write(string message)
        {
            ...
        }
    
        public override void WriteLine(string message)
        {
            ...
        }
    }
    

    TraceListener 在 System.Diagnostics 中定义。

    自定义TraceListener 必须挂接到系统才能使用。官方的做法是在注册表中设置一些东西,然后使用App.config文件来配置TraceListener

    但是我发现有一种更简单的方法可以以编程方式执行此操作:

    ErrorLogTraceListener listener = new ErrorLogTraceListener();
    PresentationTraceSources.Refresh();
    
    PresentationTraceSources.DataBindingSource.Listeners.Add(listener);
    PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Error;
    

    PresentationTraceSources 也在System.Diagnostics 中定义。

    有关跟踪源的更多信息,请参阅 Mike Hillberg 的blog

    Bea Stollnitz 在她的blog 上有一些有用的信息。

    【讨论】:

    • 我发现这只会在附加调试器时捕获错误。当调试器未附加时,WPF 不会首先发出错误。(?)有其他人经历过这种情况吗?
    • 在进一步调查中,它只是在附加调试器时改变了刷新行为。使用System.Diagnostics.Trace.AutoFlush = true; 解决了我们的问题。
    • 完整示例:jasonbock.net/jb/…
    • 请注意,如果 app.config 中没有明确定义,对 Refresh() 的调用会删除默认侦听器。几个月后返回项目后,当我在输出窗口中没有看到任何绑定错误时,我对此感到困惑。
    【解决方案2】:

    查看this blog article 可能有助于解决此问题。

    【讨论】:

    • 这是一篇关于调试数据绑定问题的好文章。但这取决于您是否首先发现了问题?这不是我真正想要的答案。我想要的(如果可能的话)首先是对如何使数据绑定问题更加突出的简明描述。
    • 您可以创建一个引发异常的自定义跟踪侦听器
    【解决方案3】:

    我实现了一个与公认答案非常相似的解决方案:

    1. 派生了一个TraceListener,它抛出而不是记录
    2. 将该监听器添加到PresentationTraceSources.DataBindingSource

    请参阅complete solution on GitHub,它包括一个演示应用程序和一个单元测试项目。

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多