【发布时间】:2011-02-08 14:29:59
【问题描述】:
我目前正在 WPF 中实现一个列表框,它将为其项目提供 2 种替代布局:
到目前为止,我已经使用DataTrigger 将ItemTemplate 切换为ListBox,并且效果很好:
<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>
但是,列表绑定到的Runs 集合也将包含不同的对象类型:
interface IRunItem
{
// ...
}
class CompletedRunItem : IRunItem
{
// ...
}
class PendingRunItem : IRunItem
{
// ...
}
每种对象类型都应该有自己的“平铺”和“图标”模板(总共有 4 个模板)。根据布尔值ShowRunsAsIcons 和列表项的类型切换这两个属性的最佳方式是什么?
我考虑过使用一对DataTemplateSelector 子类——一个根据项目类型在图块模板之间进行选择,一个根据项目类型在图标模板之间进行选择——但这感觉非常笨拙。我觉得我应该利用 WPF 根据对象类型选择正确模板的能力,但在这种情况下,我不知道如何将它与列表的不同视图选项结合起来。
关于如何做到这一点更符合 WPF 精神的任何想法?
谢谢。
【问题讨论】:
标签: c# wpf listbox datatemplateselector