【发布时间】:2015-02-25 21:40:50
【问题描述】:
我一直在关注developer guidelines from MS 来实现数据虚拟化,其中指出必须为随机访问数据虚拟化实现 IObservableVector。
我在 IObservableVector<T>, 的只读异步实现中使用响应式扩展,我称之为 AsyncReadOnlyVirtualCollection。
当我将 GridView 绑定到此 IObservableVector<SomeConcreteType> 的实例时,我会在运行时收到一个异常,即由于类型与 WinRT 不兼容而无法实例化该类型。 (无法计算类型“Windows.Foundation.Collections.IObservableVector`1[Foo]”的 GUID,因为实例化包含 Windows 运行时不支持的类型。)
如果我使用*object* 而不是*SomeConcreteType*,,这是在WinRT 和XAML 仍处于CTP 中并且仍然存在框架错误时在早期博客中所建议的,那么这可行。鉴于现在是 2015 年,我现在使用的是 Windows 8.1,并安装了最新的 Visual Studio 2013 社区,我只能假设我一定犯了某种错误。
如果 MS 指南声明它必须用于此类数据绑定,为什么不能将 IObservableVector<ConcreteType> 用作数据源?如果文档已过期,正确的方法是什么?
---更新--- 似乎引发此错误的核心代码在方法 BOOL MethodTable::IsLegalNonArrayWinRTType() 中的https://github.com/dotnet/coreclr/blob/d758145b547cc00aba3f0e3f101af27bf118e9af/src/vm/methodtable.cpp,该方法应用于上面的泛型类型 ConcreteType 或 Object - -更多的 - - 好的,通过上面的 GitHub WinRT coreclr 代码破解后,我看到有检查以确保 IObservableVector 的泛型类型与 WinRT 兼容。我现在不知道为什么会这样......有人可以启发我吗?
无论如何,为了遵守,我将具体类型移动到一个新的 Windows 运行时组件项目并添加了程序集引用,同时将后面更改为
这现在“有效”(错误消失了)...我现在有一个单独的问题:原始错误消失但枚举器被迭代而不是索引器请求......所以毕竟不是解决方案。 ...但是为什么?
进一步更新
如果该类实现IObservableVector<object> 而不是IObservabeVector<T>,则该类有效。我没有时间找出原因,但我怀疑这与无法将 <T> 转换为 <object> 有关...我将在 Codeplex 上发布我的实现以供讨论,因为我认为 Rx 方法是可能很新颖。完成后我会在这里更新。
【问题讨论】:
标签: c# wpf xaml windows-runtime windows-store-apps