1

我有一个程序在 .NET 4.0 / Windows 7 上崩溃,但在 .NET 4.5 / Windows 8+ 上运行良好。销毁控件时(例如,通过关闭控件所在的窗口),WPF 似乎试图设置DataContext为一个类型的对象MS.Internal.NamedObject——这失败了,因为控件总是期望数据上下文是与之相关的视图模型看法:

System.InvalidCastException:无法将“MS.Internal.NamedObject”类型的对象转换为“Foo.Bar.BazViewModel”类型。

这里发生了什么?我可以要求 WPF 不要像这样弄乱数据上下文,还是应该在发生这种情况时禁用控件?

4

2 回答 2

1

其他事情正在发生。

我建议创建一个独立的示例,它代表结构、绑定和提炼到其最基本形式的数据。如果该问题可以在独立项目中重现,那么您可能有一个应该报告给Microsoft Connect的错误。

示例项目更有可能揭示导致情况的差异,从而允许您解决问题。或者至少将其发布到 Stack Overflow 并让答案鲨鱼享用新鲜的示例杀戮;可以这么说。


异步数据操作可能来得太晚了。检查任何可能被关闭的帖子更新。

于 2013-11-07T01:59:26.400 回答
1

我不确定这是否是同一个问题,但对于它的价值,我也遇到了一个奇怪的情况,WPF 会DataContextChangedItemsControl. 当我将远程桌面连接到运行应用程序的服务器时,就会发生这种情况——但我无法在我的机器或任何其他机器上重现它。不知何故,我发现了根本原因:当当前的 Windows 7 主题从 Aero 更改为 Classic(或反之亦然)时,DataContext每个对象的ItemsControl都将设置为MS.Internal.NamedObject(但未销毁)。我通过将配色方案从 Classic 更改为 Basic 暂时回避了这个问题,这防止了在 RDP 登录时发生这种现象。对于我的应用程序正在运行并且用户确实更改了主题的情况,我修改了我的处理程序方法以返回如果DataContext不是预期的类型。然而,即便如此,现在集合中的所有视图项都有双倍。每次主题更改时,都会创建另一组完整的实例(每个“组”的最新实例具有 WPF 设置的正确数据上下文;其余的都是孤立的)

于 2015-03-09T12:49:47.867 回答