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

3
我试图弄清楚如何根据项目的数量和大小来更改模板。这与根据大小动态更改的Ribbon或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个回答

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";
}

谢谢 - 将ListBox.ItemTemplate绑定到了一个IMultiValueConverter,该转换器获取可用大小和项目数量,然后返回适当的资源。 - escouser

3

你可能想在WPF中使用DataTemplateSelector功能:

来自链接:

通常,当您有多个相同类型的对象的DataTemplate,并且希望根据每个数据对象的属性提供自己的逻辑来选择应用DataTemplate时,创建DataTemplateSelector。请注意,如果您有不同类型的对象,则可以在DataTemplate上设置DataType属性。如果您这样做,则无需创建DataTemplateSelector。此外,如果您具有具有不同属性但类型相同的对象,则还可以考虑使用DataTrigger或数据转换器。有关更多信息,请参见数据模板概述。

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


1
一个 DataTemplateSelector 应该基于单个项进行切换,独立于其他项:如果集合中添加了一个项,那么 templateselector 是否会为所有现有项调用?所有模板都会刷新吗?我不确定,但我认为不会。 - Bubblewrap
好的,将数据触发器绑定到父控件上适当的属性可能是未来的发展方向。 - cristobalito

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