web-dev-qa-db-ja.com

1つのリストボックスに2つのitemtemplates

クラスFruitViewModelがあります。 ListBoxアイテムのViewModelについて説明します。

<ListBox ItemsSource="{Binding Fruits}">

そして私は持っています

class BananaViewModel : FruitViewModel

そして

class AppleViewModel : FruitViewModel

FruitsにはBananaViewModelsとAppleViewModelにバインドされているItemsSourcesが含まれています。

リンゴとバナナに異なるテンプレートを作成するにはどうすればよいですか?それらは1つのリストにある必要がありますが、テンプレートが異なります

38
xSeder

x:KeyなしでDataTypeを指定することにより、特定のタイプのインスタンスに適用するDataTemplatesを定義できます。この方法を使用すると、ItemTemplateには何も割り当てません。テンプレートは自動的に適用されます。

<ListBox ItemsSource="{Binding Path=MixedList}">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type local:BananaViewModel}">
            <TextBlock Text="{Binding Name}" Foreground="Yellow"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:AppleViewModel}">
            <TextBlock Text="{Binding Name}" Foreground="Red"/>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>
73
John Bowen

XAMLのListViewでは、ItemTemplateSelectorを宣言できます。この値は、静的リソースなどから取得されます。

テンプレートセレクターの実装はDataTemplateSelectorを実装する必要があり、基本的には、バインドされたアイテムのタイプに基づいて正しいDataTemplateを選択する「if」ステートメントを含みます。おそらくコンテナのリソースに渡されたデータテンプレートを(おそらくFindResource関数を使用して)見つけます。

編集:おそらく良いリンク? http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselectorデッドリンク

3
Reddog