2015-06-20 61 views
2

我有两个用于ListBox的自定义ItemTemplates,一个用于常规项目,另一个用于所选项目。我将如何处理这方面的一个例子是:处理共享相同内容的不同项目模板

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

模板1和则Template2非常相似:

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

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

那么,是不是重复了SameContent的代码(这就好比是一个适当的方式一堆TextBlocks,面板等),或者只有一个模板是更好的方法,但是基于IsSelected属性切换DifferentContent,或者...?

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

+0

,是模板1和则Template2在控制方面是相同的,唯一的区别是数据? –

+0

@ d.moncada DifferentContent1和DifferentContent2将具有不同的控件,但具有相同的数据,SameContent将包含相同的控件和数据。 – Goran

回答

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> 
相关问题