【问题标题】:WPF: Use a different template depending on size and number of itemsWPF:根据项目的大小和数量使用不同的模板
【发布时间】:2010-08-25 21:22:47
【问题描述】:

我正在尝试研究如何根据项目的大小和数量来更改模板。这与根据大小或 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>

谢谢

【问题讨论】:

    标签: wpf xaml styles


    【解决方案1】:

    你可以在 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,该 IMultiValueConverter 采用可用的大小和项目数并返回适当的资源。
    【解决方案2】:

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

    来自链接:

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

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

    【讨论】:

    • A DataTemplateSelector 旨在基于单个项目进行切换,它是或应该独立于其他项目:如果将项目添加到集合中,是否会为所有项目调用模板选择器现有的项目也是如此?所有模板都会刷新吗?我不确定,但我不这么认为。
    • 好点 - 父控件上合适属性的数据触发器可能是前进的方向。
    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多