2

現在、WinRT プロジェクトで新しいコンテナーの作成に取り組んでいます。このコンテナーは ListView と同様に動作するため、プロパティで同様の名前を使用することにしました。

ItemsSource の DependencyProperty を作成して、組み込みの ItemsControl (他のリストの抽象的な親) のプロパティを模倣しました。ItemsControl は ItemsSource を として定義しているPlatform::Object^ので、同じことをしました。これはうまくいきます。

後で、リストに入れるアイテムを作成し、指定された ItemsTemplate のインスタンスを入力して、データ コンテキストを設定します。これは、実際に ItemsSource をPlatform::Object^反復可能なものにキャストする必要があることを意味します。残念ながら、反復可能なものにキャストするには、キャストでテンプレート化された型を指定する必要があります (例: IIterable<UIElement^>^or IIterable<Object^>^)。この段階では、新しいリスト アイテムの DataContext として使用しているだけなので、オブジェクトのタイプは特に気にしません。キャストはIIterable<Object^>^問題ありません。IIterable<Object^>^残念ながら、もともと ItemsSource に設定されていたものがや などの子としてテンプレート化されていない限り、safe_cast ではこれを行うことができませんIVectorView<Object^>^

ListView などの既存のコンテナーを使用すると、ItemsSource をVector<MyCustomViewModel^>^最初に に変換せずに に設定でき、問題なくVector<Object^>^動作します。それで、彼らはこれをどのように行うのですか?彼らは safe_cast を使用していませんか? 安全性の低いキャストを使用すると、ここで悪影響があると確信しています。他のアイデアはありますか?

TL;DR:

他の参照の IIterable を指していることがわかっているPlatform::Object^参照があります。IIterable<Platform::Object^>^iterable が最初に他のテンプレート ( など) で作成された場合でも、何らかの方法でキャストすることは可能IIterable<MyCustomViewModel^>^ですか?

4

1 に答える 1

5

C++/CX は co/contravariance 型をサポートしていPlatform::Vector<T^>ない ( は実装していないIVector<Object^>) ため、Xaml チームは特別な非ジェネリック インターフェイスWindows.UI.Xaml.Interop.IBindableObservableVectorを追加しました。これにより、反復するオブジェクト ベースのコレクションが提供されます。Platform::Vector は、特に苦労している問題を処理するために、このインターフェイスを実装しています。したがって、あなたの場合、この特別なインターフェースにキャストして利用できるはずです。

.NET コレクションがこのインターフェイスをサポートしているかどうかはわかりません。そのため、カスタム コントロールで C#/VB をサポートするには、IBindableObservableVector に dynamic_cast を実行し、結果が nullptr の場合は、他のコレクション タイプ ( IVector<Object^>)。

于 2012-12-06T01:44:10.033 に答える