我有一个在.NET 4.0 / Windows 7上崩溃的程序,但在.NET 4.5 / Windows 8+上工作正常。当销毁控件时(例如,通过关闭控件所在的窗口),WPF似乎试图将DataContext
设置为MS.Internal.NamedObject
类型的对象 - 由于控件始终需要数据而失败context是与该视图一起的视图模型:
System.InvalidCastException:无法将“MS.Internal.NamedObject”类型的对象强制转换为“Foo.Bar.BazViewModel”。
这里发生了什么?我可以要求WPF不要像这样混淆数据上下文,还是应该在发生这种情况时禁用控件?
答案 0 :(得分:1)
还有其他事情正在发生。
我建议创建一个独立的例子,它代表了最基本形式的结构,绑定和数据。如果问题可以在独立项目中重现,那么您可能有一个应该报告给Microsoft Connect的错误。
更有可能的是,示例项目将揭示导致这种情况的差异,从而可以解决问题。或者至少将其发布到Stack Overflow并允许答案鲨鱼在一个新鲜的示例杀戮上享受盛宴;可以这么说。
异步数据操作可能来得太晚。检查可以发出关闭的帖子更新。
答案 1 :(得分:1)
我不确定这是否是同一个问题,但是对于它的价值,我也遇到了一个奇怪的地方,WPF会为DataContextChanged
中的每个视图对象调用ItemsControl
处理程序。当我将远程桌面安装到运行应用程序的服务器时发生了 - 但我无法在我的机器或任何其他机器上重现它。不知何故,我发现了根本原因:当前的Windows 7主题从Aero更改为Classic(反之亦然)时,DataContext
中每个对象的ItemsControl
将设置为{{1} (但没有被破坏)。我暂时通过将颜色方案从Classic更改为Basic来解决问题,这可以防止在RDP登录时发生这种现象。对于我的应用程序正在运行且用户确实更改主题的情况,我修改了我的处理程序方法,以便在MS.Internal.NamedObject
不是预期类型时返回。然而,即便如此,现在集合中的所有视图项目都有两倍。每次主题更改时,都会创建另一组完整的实例(每个“组”的最新实例具有WPF设置的正确数据上下文;其余的都是孤立的)