且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-02-01 22:22:37

你可以在 ListBox 上设置一个样式,它会根据项目的数量来切换 ItemTemplate.

You could set a style on the ListBox, which switches ItemTemplate based on the number of items.

<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 方法可能是这样的:

The SizeConverter would be an IValueConverter which returns a size category based on the incoming count, the convert method could be something like this:

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