WPF:根据项目的大小和数量使用不同的模板

时间:2010-08-25 21:22:48

标签: wpf xaml styles

我正在尝试根据项目的大小和数量来确定如何更改模板。这与根据大小或Windows 7程序缩略图动态更改的功能区非常相似。

在这种情况下,它是ListBox的ItemTemplate,我想减小图像的大小或不显示它,而不是滚动条。

<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Title}" />                        
                <Image Source="{Binding ImageUrl}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

由于

2 个答案:

答案 0 :(得分:4)

你可以在ListBox上设置一个样式,它根据项目数切换ItemTemplate。

<ListBox ItemsSource="{Binding Items}">
    <ListBox.Resources>
        <local:SizeConverter x:Key="SizeConverter"/>
        <DataTemplate x:Key="SmallTemplate"></DataTemplate>
        <DataTemplate x:Key="MediumTemplate"></DataTemplate>
        <DataTemplate x:Key="LargeTemplate"></DataTemplate>
    </ListBox.Resources>
    <ListBox.Style>
        <Style TargetType="ListBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Small">
                    <Setter Property="ItemTemplate" Value="{StaticResource SmallTemplate}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Medium">
                    <Setter Property="ItemTemplate" Value="{StaticResource MediumTemplate}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Large">
                    <Setter Property="ItemTemplate" Value="{StaticResource LargeTemplate}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.Style>            
</ListBox>

SizeConverter将是一个IValueConverter,它根据传入的计数返回一个大小类别,convert方法可能是这样的:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    int count = (int)value;
    if (count < 4) return "Large";
    if (count < 12) return "Medium";            
    return "Small";
}

答案 1 :(得分:3)

您可能希望在WPF中使用DataTemplateSelector功能:

从链接:

  

通常,您创建一个   你有DataTemplateSelector   不止一个DataTemplate   您想要的相同类型的对象   提供你自己的逻辑来选择一个   DataTemplate基于的应用   每个数据对象的属性。注意   如果你有不同的对象   您可以设置DataType的类型   DataTemplate上的属性。如果你   这样做就没有必要了   创建一个DataTemplateSelector。   此外,如果你有对象   相同但有不同的类型   属性,你也可以考虑   使用DataTrigger或数据   转换器。有关更多信息,请参阅   数据模板概述。

或者,如上所述,DataTrigger可能是有用的。