【问题标题】:Silverlight DataContext binding error when property is null属性为空时的 Silverlight DataContext 绑定错误
【发布时间】:2013-02-22 09:44:47
【问题描述】:

在我的 Silverlight 应用程序中,我有 TabControl,该选项卡控件具有以下项:

<controls:TabItem Header="{Binding Localization.Shift1}" Style="{StaticResource     PanelBarTabItemStyle}" IsTabStop="False">
    <local:DienstDetailItemControl DataContext="{Binding Shift1, Mode=TwoWay, Converter=    {StaticResource DebugConverter}}"/>
</controls:TabItem>

当我的应用程序启动时 Shift1 属性仍然为空(当用户选择一个选项时它会被填充)。

启动应用程序时出现以下错误:

System.Windows.Data Error: ConvertBack cannot convert value 'null' (type 'null'). BindingExpression: Path='Shift1' DataItem='SDB.Zorgplanner.Client.ViewModels.ViewModels.DienstDetailViewModel' (HashCode=13572818); target element is 'SDB.Zorgplanner.Client.Assets.Controls.DienstDetailItemControl' (Name=''); target property is 'DataContext' (type 'System.Object').. System.MethodAccessException: Attempt by method 'System.Windows.CLRPropertyListener.set_Value(System.Object)' to access method 'SDB.Zorgplanner.Client.ViewModels.ViewModels.DienstDetailViewModel.set_Shift1(SDB.Zorgplanner.UIModel.Dienst)' failed.
   bij System.RuntimeMethodHandle.PerformSecurityCheck(Object obj, RuntimeMethodHandleInternal method, RuntimeType parent, UInt32 invocationFlags)
   bij System.RuntimeMethodHandle.PerformSecurityCheck(Object obj, IRuntimeMethodInfo method, RuntimeType parent, UInt32 invocationFlags)
   bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   bij System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   bij System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
   bij System.Windows.CLRPropertyListener.set_Value(Object value)
   bij System.Windows.PropertyAccessPathStep.set_Value(Object value)
   bij System.Windows.Data.BindingExpression.UpdateValue().

关于如何解决这个问题的任何想法?

有没有办法从视图模型中以编程方式设置 tabitems 的数据上下文?

【问题讨论】:

  • 能贴出DebugConverter的源码吗?
  • DebugConverter 是空的,可以在那里调试值。没有它,它仍然显示相同的错误。

标签: .net silverlight xaml


【解决方案1】:

问题原来是 Shift1 属性的私有设置器...我删除了私有属性并且一切正常 :)

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。
  • @RomanC 这是作者,回答他/她自己的问题;-)
  • 它可能对其他有完全相同问题的人有用。
【解决方案2】:

如果您查看错误,您会注意到它是由 ConvertBack 方法引发的。这对于 DataContext 绑定来说是不寻常的,这让我注意到您有一个用于 DataContext 的 TwoWay 模式绑定。除非您明确需要 TwoWay 绑定,否则我建议您切换到 OneWay(或者只是省略 XAML 中的 mode 属性,它执行相同的操作)。

【讨论】:

  • 我确实需要此数据上下文的双向绑定,它公开了我将能够编辑的属性。问题是在应用程序启动时 Shift1 属性为空..
  • 您的代码设置方式意味着当 DataContext 更改时将设置 Shift1 属性。 DataContext 属性是否发生了很大变化并且您需要不断更改 Shift1 属性以匹配更改?还是您只需要引用 Shift1 属性?因为如果第二种情况为真,您可以通过如下代码访问它:var shift1reference=DataContext as TypeOfShift1Property;if (shift1reference!=null){DoStuff(shift1reference);}
  • 此外,FrameworkElement 类有一个 DataContextChanged 事件,您可以订阅该事件以跟踪对该依赖项属性的更改。我建议你使用它而不是 TwoWay 绑定。
  • Shift1 属性变化很大(日历应用程序)。我可以尝试一种单向绑定,并自己减轻属性更改,但这将是相当多的工作,我不明白为什么 silverlight 会抛出这个错误,在 Silverlight V3 中这没有发生,它只会忽略 Shift1 的空值并继续。除了我在调试模式下遇到的异常之外,该应用程序实际上工作正常......因为一旦 Shift1 属性被填充,一切都很好......
  • 在这种情况下,我建议使用带有 TwoWay 绑定的自定义转换器,它可以优雅地处理空值。
猜你喜欢
  • 2010-12-27
  • 2011-11-28
  • 2010-09-27
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
相关资源
最近更新 更多