はじめに
ContentControlは、WPFで複数の画面をデータに合わせて出し分けるときの肝になるコントロールです。ContentControlがあるお陰で、制作者はDataTemplateとViewModelの組み合わせで画面を出し分けることができます。この機構が無いと予め画面を非表示の状態で置いておいて必要になったら表示状態へ変更するというプログラムを実装する必要があります。ContentControlは、入力されたデータをルールに沿って表示するコントロールですが、プログラムを誤った場合でもクラス名を表示して間違っていることを教えてくれます。試行錯誤しながら実装しているときには、ヒントになることがあります。
非常に複雑な挙動
引用
- ContentTemplateにDataTemplateが設定されている場合、ContentプロパティにContentTemplateを適用した結果を表示します。
- ContentTemplateSelectorにDataTemplateSelectorが設定されている場合、ContentプロパティにContentTemplateSelectorが返したDataTemplateを適用した結果を表示します。
- Contentプロパティに設定された値の型に紐づけられたDataTemplateがある場合、そのDataTemplateを適用した結果を表示します。
- ContentプロパティがUIElement型の場合、そのまま表示されます。(UIElementにすでに親がいる場合は例外が出ます)
- Contentプロパティに設定された値の型に紐づけられたTypeConverterでUIElementに変換するものがある場合は、変換した結果を表示します。
- Contentプロパティに設定された値の型に紐づけられたTypeConverterでString型に変換するものがある場合はString型に変換してTextBlockにラップして表示します。
- Contentプロパティに設定された値の型がXmlElementの場合は、InnerTextプロパティの値をTextBlockにラップして表示します。
- Contentプロパティに設定された値をToStringした結果をTextBlockにラップして表示します。
WPF4.5入門 その47 「コンテンツモデル」
かずきさんのブログでも説明されているように、WPFのコンテンツモデルは非常に複雑怪奇です。
WinUI3の設計者もそう思ったのか、簡略化されているようです。
DataTemplateに、x:DataTypeを設定してContentプロパティに、ViewModelをバインディングしても対応したDataTemplateが表示されません。
もしかすると実装方法が間違っている可能性もありますが、検索してもDataTemplateSelectorを利用して出し分ける方法しか見つかりませんでした。
動作パフォーマンスを最適化する目的で意図的に簡略化しているのかも知れませんね。
画面数が多いとDataTemplateSelectorで実装するのは面倒なので、回避方法が欲しいところです。
Application.Current.Resources["リソース名"]で、リソースが取得できるはずなので、ContentTemplateSelectorに実装して試してみます。
うむむ。。。「エラーを特定できません」という例外が発生してしまいました。