【发布时间】:2013-11-07 00:40:25
【问题描述】:
我有一个程序在 .NET 4.0 / Windows 7 上崩溃,但在 .NET 4.5 / Windows 8+ 上运行良好。销毁控件时(例如,通过关闭控件所在的窗口),WPF 似乎试图将 DataContext 设置为 MS.Internal.NamedObject 类型的对象——这失败了,因为控件总是期望数据上下文是与该视图配套的视图模型:
System.InvalidCastException:无法将“MS.Internal.NamedObject”类型的对象转换为“Foo.Bar.BazViewModel”类型。
这里发生了什么?我可以要求 WPF 不要像这样弄乱数据上下文,还是应该在发生这种情况时禁用控件?
【问题讨论】:
-
Can I ask WPF to not...- 不,你不能强迫 WPF 满足你的意愿。更正您拥有的任何有问题的代码。如果将 UI 元素的DataContext设置为任何对象,也不应在任何意外情况下,UI 元素不应使整个应用程序崩溃。更正您的代码。 -
@HighCore:没有任何地方证明 WPF 保留从控件下方更改
DataContext的权利。 -
上下文...您究竟是如何销毁控件?
-
@OmegaMan:用户关闭控件所在的窗口。
-
@BillyONEal 您可以继续尝试用木刀穿透铁墙(并想知道为什么没有记录任何木头不能破坏铁的地方),或者您可以更正有问题的代码。应该是
if (DataContext is MyViewModel)的问题......事情就是这样。顺便说一句,即使 WPF 没有这样做,您也会在您的应用程序中创建潜在的崩溃,这很糟糕。如果需要,UI 元素应该“期望”特定的 ViewModel,但如果传递了不同的 ViewModel / DataContext,它们永远不会崩溃。
标签: .net wpf datacontext