【问题标题】:Switching ListBox ItemTemplate based on both item type and view option根据项目类型和视图选项切换 ListBox ItemTemplate
【发布时间】:2011-02-08 14:29:59
【问题描述】:

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

到目前为止,我已经使用DataTriggerItemTemplate 切换为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


    【解决方案1】:

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

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

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

    <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>
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2015-02-03
      相关资源
      最近更新 更多