【问题标题】:WPF Databinding: Catching exceptions thrown by property gettersWPF 数据绑定:捕获由属性获取器引发的异常
【发布时间】:2011-06-19 10:38:47
【问题描述】:

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

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

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

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

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

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

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

TraceListener 方法最终可能会起作用,但它似乎有点 hackish。是否还有其他我遗漏的选项,或者我几乎被 TraceListener 卡住了?

【问题讨论】:

  • 我想看看这个问题的答案

标签: wpf exception-handling binding


【解决方案1】:

我建议使用面向方面的编程 (AOP) 方法来解决这个问题。它允许你在编译时注入代码,用你想要的任何东西包装你的 getter,在这种情况下是 try/catch 和日志记录。我唯一使用过的是 PostSharp Laos,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。我建议使用基于编织的方法。

【讨论】:

  • 感谢您的评论。我认为这是迄今为止我见过的最好的建议。
  • @MartyDill 那么您能否将其转换为可行的解决方案?如果你能发布你的经验,那就太好了。
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多