gpt4 book ai didi

c# - 基于项目类型和 View 选项切换 ListBox ItemTemplate

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:28 25 4
gpt4 key购买 nike

我目前正在 WPF 中实现一个列表框,它将为其项目提供 2 种替代布局:

Alternative list item styles of wrapping icons and detailed tiles

到目前为止,我已使用 DataTriggerListBox 切换 ItemTemplate 并运行良好:

<ListBox ItemsSource="{Binding Runs}" SelectedItem="{Binding SelectedRun}">
<ListBox.Style>
<Style TargetType="ListBox">
<Setter Property="ItemTemplate" Value="{StaticResource tileTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ShowRunsAsIcons}" Value="True">
<Setter Property="ItemTemplate" Value="{StaticResource iconTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Style>
</ListBox>

但是,列表绑定(bind)到的 Runs 集合也将包含不同类型的对象:

interface IRunItem
{
// ...
}

class CompletedRunItem : IRunItem
{
// ...
}

class PendingRunItem : IRunItem
{
// ...
}

每个对象类型都应该有自己的“tile”和“icon”模板(总共制作 4 个模板)。根据 bool 值 ShowRunsAsIcons 和列表项的类型,打开这两个属性的最佳方式是什么?

我考虑过使用一对 DataTemplateSelector 子类——一个用于根据项目类型在磁贴模板之间进行选择,一个用于根据项目类型在图标模板之间进行选择——但这只是感觉非常笨重。我觉得好像我应该利用 WPF 的能力来根据对象的类型选择正确的模板,但在这种情况下,我不知道如何将它与列表的不同 View 选项结合起来。

关于如何执行此操作更符合 WPF 精神的任何想法?

谢谢。

最佳答案

虽然我不认为这是最佳答案,但我已经改变了我的方法以利用 WPF 的自动模板选择。我现在为每个具体数据类定义了“顶级”数据模板。

这些数据模板仅包含一个 ContentControl,其 ContentTemplate 属性通过 DataTrigger 设置,绑定(bind)到数据上下文的 ShowRunsAsIcons 属性。

例如,这是 PendingRunItem 的无 key 数据模板:

<DataTemplate DataType="{x:Type Common:PendingRunItem}">
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="ContentTemplate" Value="{StaticResource pendingTileTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.ShowRunsAsIcons, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource pendingIconTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>

相关类的图标和图 block 表示只是常规数据模板。 ListBox 不再需要定义其 Style 属性:

<ListBox ItemsSource="{Binding Runs}" SelectedItem="{Binding SelectedRun}"/>

我很想知道人们对这种方法的看法,以及与使用一两个 DataTemplateSelector 相比,它的优缺点。

关于c# - 基于项目类型和 View 选项切换 ListBox ItemTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com