我一直遵循developer guidelines from MS来实现数据虚拟化,该状态规定必须为随机访问数据虚拟化实现IObservableVector。
我在IObservableVector<T>,
的只读异步实现中使用了Reactive Extensions,将其称为AsyncReadOnlyVirtualCollection。
当我将GridView绑定到此IObservableVector<SomeConcreteType>
的实例时,我在运行时遇到异常,由于与WinRT不兼容的类型,无法实例化该类型。 (由于实例化包含Windows运行时不支持的类型,因此无法计算类型为Windows.Foundation.Collections.IObservableVector`1 [Foo]的GUID。)
如果在WinRT和XAML仍在CTP中并且框架错误仍然存在的情况下,如果我使用*object*
而不是早期博客中建议的*SomeConcreteType*,
,则此方法有效。鉴于现在是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 Runtime Component项目并添加了程序集引用,同时将其更改为
现在可以正常工作了(错误消失了)...我现在有一个单独的问题:原来的错误消失了,但是迭代了Enumerator而不是请求了索引器.....所以毕竟不是解决方案....但为什么?
进一步更新
如果该类实现了IObservableVector<object>
而不是IObservabeVector<T>
,则该类有效。我没有时间找出原因,但是我怀疑这与无法将<T>
强制转换为<object>
有关...我将把实现发布到Codeplex上进行讨论,因为我认为Rx方法是可能是新颖的。完成后,我将在这里更新。
最佳答案
必须出于某些原因使用IObservableVector<object>
。
有趣的是,这是在这种情况下使用Rx进行的实验
http://www.codeproject.com/Articles/995043/An-experiment-with-random-access-data-virtualisati