一个列表框的两个项模板

41

我有一个类 FruitViewModel,用于描述ListBox项的ViewModels。

<ListBox ItemsSource="{Binding Fruits}">

而且我已经拥有了

class BananaViewModel : FruitViewModel

class AppleViewModel : FruitViewModel

Fruits 包含绑定到 ItemsSourceBananaViewModelAppleViewModel

我如何为苹果和香蕉制作不同的模板?它们应该在一个列表中,但是有不同的模板。

2个回答

81

通过指定DataType而不使用x:Key,您可以定义适用于特定类型的任何实例的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>

3
谢谢您提到必须省略x:Key! - Matt Williams
2
如果您想在<Window.Resources>中拥有2个DataTemplates,那么如何将'ItemTemplate='属性设置为多个DataTemplates?特别是我想将TreeView的2个HierarchicalDataTemplates外包到<Window.Resources>中。Multibinding可能是一个解决方案。 - Mechandrius

3
在XAML中的ListView中,您可以声明一个ItemTemplateSelector。它的值将来自于静态资源或类似的内容。
模板选择器的实现应该实现DataTemplateSelector并基本上包含“if”语句,根据绑定项的类型选择正确的DataTemplate。它可能会从传递给它的容器资源中找到DataTemplate(可能使用FindResource函数)。
编辑:好的链接也许?(链接已失效)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接