WPF中是否有类似于Style.BasedOn用于DataTemplate的��能?

3

目前,我有两个非常大的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}}" />

From DataTemplate2

<TextBlock Style="{StaticResource TextStyle}" FontSize="20" Foreground="White"
HorizontalAlignment="Left" Panel.ZIndex="2" Text="{Binding ElapsedTime.TotalHours,
Converter={StaticResource DoubleToIntegerConverter}, StringFormat={}{0:#00}}" />

有没有什么方法可以避免复制整个DataTemplate,但仍然在第二个模板中具有此TextBlock的文本绑定中的一个差异?
4个回答

1

我已经在这里问过这个问题了,但不幸的是没有得到答案。 但在这种特定情况下,您可以将字体大小、前景色、水平对齐等移动到一个样式中(比如说textstyle2),该样式基于您当前的文本样式。


我想改变的唯一一件事是 Text 属性上的绑定,但我不认为我可以在样式中更改它,对吗? - Sheridan

1

不,DataTemplate 没有继承性。如果你考虑一下,你如何覆盖 DataTemplate 的一部分呢?

解决方案:使用另一个 Style 来捕获两个模板之间的公共属性。如果它只在同一个 Resources 块中使用,可以将其作用域限定在其中。这是更清晰或更符合 WPF 的做法。


DataTemplate有两百到三百行,包含了数十个控件和众多的网格布局。除了这一行之外,所有内容都是公共的。我该如何使用样式来捕获所有内容? - Sheridan
你不能在样式中捕获它。我认为你需要看一下你设计的DataTemplate,也许将其分成较小的部分(考虑重用),并在条件改变时使用触发器来修改属性。如果可能的话,我会避免创建自定义控件。 - Dennis
如果你说“将其分解成更小的部分”,意思是将渐变、效果等放入资源中,然后只从DataTemplate控件中引用它们,那么我已经在这样做了。只是这些控件和绑定非常多。如果这不是你的意思,请进一步解释。 - Sheridan

1
我从另一篇帖子(Liz的)中得到了答案。基本上,您可以将所有常见控件放入一个DataTemplate中,然后创建另外两个DataTemplate,每个DataTemplate都使用第一个DataTemplate作为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。


0

除了Dennis提出的建议,您还可以创建一个自定义控件,将其放置在DataTemplate中并重新设计该控件,而不是DataTemplate。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接