避免在StyleHelper.OnBindingValueInTemplateChanged中的NullReferenceException崩溃

时间:2014-06-03 09:24:03

标签: .net wpf exception binding nullreferenceexception

我的应用程序已经使用以下堆栈跟踪崩溃了几次:

An uncatched exception was thrown by application: System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Windows.StyleHelper.OnBindingValueInTemplateChanged(Object sender, BindingValueChangedEventArgs e)
   at System.Windows.Data.BindingExpressionBase.ChangeValue(Object newValue, Boolean notify)
   at System.Windows.Data.MultiBindingExpression.TransferValue()
   at System.Windows.Data.MultiBindingExpression.Transfer()
   at System.Windows.Data.MultiBindingExpression.UpdateTarget(Boolean includeInnerBindings)
   at System.Windows.Data.MultiBindingExpression.AttachToContext(Boolean lastChance)
   at System.Windows.Data.MultiBindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)
   at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
   at MS.Internal.Data.DataBindEngine.Run(Object arg)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

问题是这种情况只发生在生产环境中并且很少发生 - 过去一个月大约2-3次。所以我无法调试它,我只有日志。 系统导航到另一个状态后发生崩溃(我在日志中看到下一个状态视图和视图模型都已加载)。 堆栈跟踪不指向特定位置。

我对这个问题进行了一些调查,以及我的调查结果:

StyleHelper类的source code包含此方法上方的注释:"当数据触发条件中的绑定更改其值时调用#34;。 在日志中编写的调用堆栈中,我看到MultiBindingExpression,所以我猜这个问题与MultiDataTrigger有关。 我们在xamls中使用MultiDataTrigger的唯一地方(与此特定状态相关)是this style。 它还看起来(来自OnBindingValueInTemplateChanged代码)唯一的null候选者是发送者(即BindingExpression)或此表达式的TargetElement(因为另一个变量具有空检查,并且如果在任何调用的方法中发生崩溃这个方法所以它已被写入调用堆栈)。 我真的不明白在哪种情况下,这些朋友中的两个可能是空的......

之前有没有人面对同样的例外,可以告诉它如何发生? 或者我是如何避免应用程序崩溃的任何建议?

1 个答案:

答案 0 :(得分:0)

尝试在IMultiValueConverter的Convert方法中使用try / catch。