处理共享相同内容的不同项目模板

时间:2015-06-20 20:42:36

标签: wpf wpf-controls .net-4.5

我有两个自定义ItemTemplates用于ListBox,一个用于常规项目,一个用于所选项目。我将如何处理这个问题的一个例子是:

<ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
    <Setter Property="ContentTemplate" Value="{StaticResource Template1}" />
    <Style.Triggers>
      <Trigger Property="IsSelected" Value="True">
        <Setter Property="ContentTemplate" Value="{StaticResource Template2}" />
      </Trigger>
    </Style.Triggers>
  </Style>
</ListBox.ItemContainerStyle>

Template1和Template2非常相似:

<DataTemplate x:Key="Template1">
  <SameContent />
  <DifferentContent1 />
</DataTemplate>

<DataTemplate x:Key="Template2">
  <SameContent />
  <DifferentContent2 />
</DataTemplate>

那么,在两个模板中复制SameContent的代码(就像一堆TextBlocks,Panels等)是一种正确的方法,或者只有一个模板更好的方法,但切换DifferentContent基于IsSelected属性,还是......?

如果第二种方法,它将如何正确完成?

1 个答案:

答案 0 :(得分:1)

显然复制代码不是一个很好的解决方案。更好的方法是将另一个DataTemplate定义为您的常用内容,然后使用ContentPresenter来展示它:

<Window.Resources>
    <DataTemplate x:Key="CommonTemplate">
        <TextBlock Text="{Binding CommonProperty1}" />
        <TextBlock Text="{Binding CommonProperty2}" />
    </DataTemplate>
    <DataTemplate x:Key="Template1" >
        <StackPanel>
            <ContentPresenter ContentTemplate="{StaticResource CommonTemplate}"/>
            <TextBlock Text="{Binding Template1Property1}"/>
            <TextBlock Text="{Binding Template1Property2}"/>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="Template2" >
        <StackPanel>
            <ContentPresenter ContentTemplate="{StaticResource CommonTemplate}"/>
            <TextBlock Text="{Binding Template2Property1}"/>
            <TextBlock Text="{Binding Template2Property2}"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>