gpt4 book ai didi

windows - 从 C++/Cx 中的框架对象转换为模板化类

转载 作者:可可西里 更新时间:2023-11-01 09:55:50 26 4
gpt4 key购买 nike

我目前正在我的 WinRT 项目中创建一个新容器。此容器的行为类似于 ListView,因此我决定在其属性中使用类似的名称。

我为 ItemsSource 创建了一个 DependencyProperty 来模仿内置 ItemsControl(其他列表的抽象父级)。 ItemsControl 将 ItemsSource 定义为 Platform::Object^ ,所以我也这样做了。这很好用。

稍后,是时候创建要进入列表的项目,用指定的 ItemsTemplate 实例填充它们,并设置它们的数据上下文。这意味着我需要从 Platform::Object^ 实际转换 ItemsSource变成可迭代的东西。不幸的是,要将它转换为可迭代的东西,我需要在转换中指定模板化类型(例如 IIterable<UIElement^>^IIterable<Object^>^ )。在这个阶段,我并不特别关心它是什么类型的对象,因为我只是将它用作新列表项的 DataContext,因此转换为 IIterable<Object^>^会没事的。不幸的是,safe_cast 不允许我这样做,除非最初设置为 ItemsSource 的东西也被模板化为 IIterable<Object^>^。或一些 child ,例如 IVectorView<Object^>^ .

对于现有的容器,例如 ListView,您可以将 ItemsSource 设置为 Vector<MyCustomViewModel^>^无需先将其转换为 Vector<Object^>^它工作得很好。那么他们是怎么做到的呢?他们不使用 safe_cast 吗?我很确定使用不太安全的 Actor 会在这里产生不利影响。还有其他想法吗?

长话短说:

我有一些 Platform::Object^我知道的引用指向其他引用的 IIterable。是否可以将其转换为 IIterable<Platform::Object^>^不知何故,即使可迭代对象最初是使用其他模板(例如 IIterable<MyCustomViewModel^>^ )创建的?

最佳答案

因为 C++/CX 不支持类型协变/逆变(Platform::Vector<T^> 未实现 IVector<Object^>),Xaml 团队添加了一个特殊的非通用接口(interface) Windows.UI.Xaml.Interop.IBindableObservableVector ,它为您提供了一个基于对象的集合来迭代。 Platform::Vector 专门实现此接口(interface)来处理您遇到的问题。因此,在您的情况下,您应该能够转换为并使用此特殊接口(interface)。

我不确定 .NET 集合是否支持此接口(interface),因此为了让您的自定义控件支持 C#/VB,您可能需要对 IBindableObservableVector 执行 dynamic_cast,如果结果为 nullptr,则尝试转换为其他集合类型(例如 IVector<Object^> )。

关于windows - 从 C++/Cx 中的框架对象转换为模板化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com