2011-02-08 94 views
2

我目前正在实施的WPF列表框,将有2替代布局的项目视图选项切换列表框的ItemTemplate:基于两个项目的类型和

Alternative list item styles of wrapping icons and detailed tiles

到目前为止,我已经做到了这一点使用DataTrigger切换ItemTemplateListBox和它的工作很好:

<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的精神?

谢谢。

回答

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或两个时。