处理共享相同内容的不同项目模板
问题描述:
我有两个用于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,或者...?
如果第二种方法,它将如何正确完成?
答
很明显,重复代码并不是一个很好的解决方案。更好的方法是定义另一个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>
,是模板1和则Template2在控制方面是相同的,唯一的区别是数据? –
@ d.moncada DifferentContent1和DifferentContent2将具有不同的控件,但具有相同的数据,SameContent将包含相同的控件和数据。 – Goran