目前,我有两个非常大的DataTemplate对象,可以在两个ListBox中显示两组项目。 DataTemplates在两个样式中的ContentTemplate属性中引用,这两个样式在两个ListBox的ItemContainerStyle属性中设置。这些项目的类型相同,DataTemplates相同,但以下控件除外:
来自DataTemplate1
<TextBlock Style="{StaticResource TextStyle}" FontSize="20" Foreground="White"
HorizontalAlignment="Left" Panel.ZIndex="2" Text="{Binding RemainingTime.TotalHours,
Converter={StaticResource DoubleToIntegerConverter}, StringFormat={}{0:#00}}" />
来自DataTemplate2
<TextBlock Style="{StaticResource TextStyle}" FontSize="20" Foreground="White"
HorizontalAlignment="Left" Panel.ZIndex="2" Text="{Binding ElapsedTime.TotalHours,
Converter={StaticResource DoubleToIntegerConverter}, StringFormat={}{0:#00}}" />
是否有某种方法可以避免重复整个Dataemplate,但在第二个模板中TextBlock的文本绑定仍然存在这一区别?
答案 0 :(得分:1)
我已经在这里问了一次这个问题,不幸的是没有。 但在这种特定情况下,你可以将fontsize,foreground,horizontalalignment..etc移动到一个基于你当前文本样式的样式(比如textstyle2)。
答案 1 :(得分:1)
不,DataTemplate
没有继承权。如果你想一想,你会如何覆盖DataTemplate
的一部分?
解决方案:使用其他Style
来捕获两个模板之间的公共属性。如果只需要它,您可以将它放在同一个Resources
块中。它更干净或更多WPF的做事方式。
答案 2 :(得分:1)
我从另一篇文章(Liz)得到了答案。基本上,您可以将所有常用控件放在一个DataTemplate中,然后创建另外两个DataTemplate,每个DataTemplates使用第一个作为ContentPresenter中的ContentTemplate。然后,您可以将不同的控件添加到后面的一个或两个DataTemplates中。 Liz提供了一个代码示例。
<DataTemplate x:Key="UserTemplate">
<!-- show all the properties of the user class here -->
</DataTemplate>
<DataTemplate DataType="{x:Type local:User}">
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource UserTemplate}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Author}">
<StackPanel>
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource UserTemplate}"/>
<!-- show all the additional Author properties here -->
</StackPanel>
</DataTemplate>
再次感谢Liz。
答案 3 :(得分:0)
除了Dennis建议的内容之外,您始终可以创建一个自定义控件,只需将其放在DataTemplate中并重新设置该控件而不是DataTemplate。