template内のテンプレートを変更しないでください。それは機能しません。
これを行うにはいくつかの方法があります。アプリケーションの構成方法によって異なります。最も一般的な方法は、
- ContentControl または ItemsControl がプロパティ/コレクションにバインドされている
- コレクションには、異なるタイプのインスタンスが 1 つ以上含まれています
- インスタンス タイプと一致する DataType を持つアプリケーションのリソース内で DataTemplate を定義します。
たとえば、アプリケーションにいくつかのモデルがあるとします
public sealed class Foo
{
public string Text {get;set;}
}
public sealed class Bar
{
public bool Checked {get;set;}
}
アプリケーションは、これらのインスタンスを 1 つ以上含むプロパティを公開します
public partial class MainWindow : Window
{
//INotifyPropertyChanged/DependencyObject stuff left out!
public object FooOrBar {get;set;}
//snip
}
XAML には、プロパティにバインドできるItemsControlまたはContentControlなどを拡張する UIElement タイプがあります。
<Window
x:Name="root"
xmlns:t="clr-namespace:MyApplicationWhereFooAndBarLive"
SkipAllThatXmlnsDefinitionNonsenseForSpaceSavingsInThisExample="true"/>
<!-- see Resources below -->
<ConentControl Content="{Binding FooOrBar, ElementName=root}" />
</Window>
最後に、アプリケーションのリソース内でタイプごとに DataTemplates を定義します。
<Window.Resources>
<DataTemplate DataType="{x:Type t:Foo}">
<TextBox Text="{Binding Text}" />
</DataTemplate >
<DataTemplate DataType="{x:Type t:Bar}">
<CheckBox Checked="{Binding Checked}" />
</DataTemplate >
</Window.Resources>
DataTemplate 選択のプロセスは次のようになります。
- 誰かがどこかに設定します(この例では言います)
FooOrBar = new Foo();
- ContentControl のコンテンツ バインディングの更新 (INPC または DependencyProperty 経由)
- ContentControl はそのDataTemplateSelectorを探し、構成されていないことを検出し、デフォルトの実装を使用します。
- デフォルトの DataTemplateSelector は、Content プロパティにバインドされたオブジェクトの型を取得します。
- DataTemplateSelector は (本質的に) DataTemplate であり、ステップ 4 で識別されたインスタンス タイプと一致するタイプのキーを持つ Resourceの論理ツリーを検索します。
- DataTemplate が見つかり、ConentControl に渡されます
- ContentControl
LoadContent()
メソッドを介してビジュアル ツリーを読み込みます。
- ContentControl は、このビジュアル ツリーのルートの DataContext を Content プロパティ (この場合は の新しいインスタンス
Foo
)内の値に設定します。
- このビジュアル ツリーは (IIRC) ConentControl の子として追加され、UI 内に表示されるようになりました。
中間が追加されることを除いて、ほぼ同じことが ItemsControl にも当てはまります (つまり、ListBox は ListBoxItem を中間として使用し、LBI は ContentControl です)。