WPF数据绑定:捕获属性getter抛出的异常

时间:2011-02-01 17:22:17

标签: wpf exception-handling binding

我正在寻找一种应用程序范围的方法来捕获由数据绑定属性getter(和setter引发的异常,但这样做没有那么多困难)。

这些事件都不会捕获getter抛出的异常:

 AppDomain.CurrentDomain.UnhandledException
 Application.Current.DispatcherUnhandledException
 Application.Current.Dispatcher.UnhandledException

另一个想法是使用带有UpdateSourceExceptionFilter的自定义绑定类,如this thread中所述。不幸的是,这种方法只捕获属性设置器中的异常,而不是getter。

我看到的最后一个选项是使用PresentationTraceSources跟踪侦听器:

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

这种方法似乎基本上可以做我想要的。不幸的是,它只给了我一个字符串,而不是Exception,这意味着我必须做一些解析工作才能得到实际的错误。

TraceListener方法最终可能会起作用,但似乎有点hackish。还有其他我缺少的选项,还是我几乎坚持使用TraceListener?

1 个答案:

答案 0 :(得分:1)

我建议使用面向方面编程(AOP)方法来解决这个问题。它允许你在编译时注入代码,用你想要的东西包装你的getter,在这种情况下是try / catch和logging。我唯一与之合作的是PostSharp老挝,PostSharp http://www.sharpcrafters.com的免费版本。

我相信这是一个很好的起点,http://www.richard-banks.org/2009/02/aspect-oriented-programming.html,在这个例子中,他包含了能够自动调用NotifyPropertyChanged的setter。还有其他几个AOP项目,你也可以使用,但我没有使用它们。这是一个很好的清单:http://www.bodden.de/tools/aop-dot-net。我建议采用基于编织的方法。