【发布时间】:2009-04-22 08:25:58
【问题描述】:
我经常发现我不小心破坏了应用程序中的数据绑定。通过重命名属性而不是在 XAML 中重命名它,或者属性由于某种原因引发异常。
默认情况下,数据绑定错误会记录到调试输出中,抛出的异常会被捕获和抑制。
有没有一种简单的方法可以在调试输出记录后引发异常?
我想尽快知道数据绑定是否被破坏(最好是在自动化测试中发现),并且不要冒在人工测试之前可能被忽视的风险。
【问题讨论】:
标签: c# wpf data-binding xaml
我经常发现我不小心破坏了应用程序中的数据绑定。通过重命名属性而不是在 XAML 中重命名它,或者属性由于某种原因引发异常。
默认情况下,数据绑定错误会记录到调试输出中,抛出的异常会被捕获和抑制。
有没有一种简单的方法可以在调试输出记录后引发异常?
我想尽快知道数据绑定是否被破坏(最好是在自动化测试中发现),并且不要冒在人工测试之前可能被忽视的风险。
【问题讨论】:
标签: c# wpf data-binding xaml
经过一番拖延后,我终于着手编写解决方案来解决我最初的问题。
我的解决方案使用自定义的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 上有一些有用的信息。
【讨论】:
System.Diagnostics.Trace.AutoFlush = true; 解决了我们的问题。
查看this blog article 可能有助于解决此问题。
【讨论】:
我实现了一个与公认答案非常相似的解决方案:
TraceListener,它抛出而不是记录PresentationTraceSources.DataBindingSource
请参阅complete solution on GitHub,它包括一个演示应用程序和一个单元测试项目。
【讨论】: