現在、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^>^
ですか?