Есть ли в WPF что-то похожее на Style.BasedOn для DataTemplate? - PullRequest
3 голосов
/ 04 декабря 2010

На данный момент у меня есть два очень больших объекта DataTemplate для отображения двух наборов элементов в двух списках. На шаблоны данных ссылаются в свойстве ContentTemplate в двух стилях, которые задаются в свойствах ItemContainerStyle двух списков. Элементы имеют одинаковый тип, а шаблоны данных идентичны, за исключением следующего элемента управления:

Из 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 во втором шаблоне?

Ответы [ 4 ]

1 голос
/ 15 декабря 2010

Я получил ответ на это из другого поста (от Лиз). По сути, вы можете поместить все общие элементы управления в один DataTemplate, а затем создать еще два DataTemplate, каждый из которых использует первый как ContentTemplate в ContentPresenter. Затем вы можете добавить различные элементы управления в один или оба последних шаблона данных. Лиз предоставила пример кода.

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

Еще раз спасибо, Лиз.

1 голос
/ 04 декабря 2010

Нет, для DataTemplate нет наследования. Если подумать, как бы вы переопределили часть DataTemplate?

Решение: Используйте другое Style, чтобы зафиксировать общие свойства между двумя шаблонами. Вы можете поместить его в тот же блок Resources, если он нужен только вам. Это намного чище или больше WPF способ делать вещи.

1 голос
/ 04 декабря 2010

Я уже задавал этот вопрос здесь один раз, и, к сожалению, его нет. но в этой конкретной ситуации вы можете переместить размер шрифта, передний план, горизонтальное выравнивание и т. д. в стиль (скажем так: stylestyle2), который основан на вашем текущем текстовом стиле.

0 голосов
/ 05 декабря 2010

В дополнение к тому, что предложил Деннис, вы всегда можете создать собственный элемент управления, который вы просто вставляете в свой DataTemplate и изменяете стиль этого элемента управления вместо DataTemplate.

...