DataTemplate включает другой DataTemplate
Смотрите ниже, все DataTemplates имеют одинаковые первые два TextBlock.
В fieldStringTemplate и fieldDateTemplate я хотел бы сослаться на fieldTemplate, поэтому я не повторяю эти два.
Как обратиться к DataTemplate из DataTemplate?
Реальное приложение имеет гораздо больше шаблонов и много общих элементов.
В реальном приложении это классы, которые реализуют Field.
FieldTemplateSelector основан на классе.
<Window.Resources>
<local:FieldTemplateSelector x:Key="fieldTemplateSelector"/>
<DataTemplate x:Key="fieldTemplate">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=DisplayValue}" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="fieldStringTemplate">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=DisplayValue}" />
<TextBox Text="{Binding Path=FieldValue}" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="fieldDateTemplate">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=DisplayValue}" />
<DatePicker SelectedDate="{Binding Path=FieldValue}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Path=Fields}"
ItemTemplateSelector="{StaticResource fieldTemplateSelector}"
HorizontalContentAlignment="Stretch">
</ListBox>
</Grid>
1 ответ
Решение
Мне кажется, было бы гораздо лучше сделать что-то вроде этого:
<DataTemplate x:Key="fieldStringTemplate">
<TextBox Text="{Binding Path=FieldValue}" />
</DataTemplate>
<DataTemplate x:Key="fieldDateTemplate">
<DatePicker SelectedDate="{Binding Path=FieldValue}" />
</DataTemplate>
<!-- and so on... -->
<DataTemplate x:Key="common">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=DisplayValue}" />
<ContentPresenter Content="{Binding}"
ContentTemplateSelector="{StaticResource fieldTemplateSelector}"/>
</StackPanel>
</DataTemplate>
<ListBox ItemsSource="{Binding Path=Fields}"
ItemTemplate="{StaticResource common}"
HorizontalContentAlignment="Stretch">
</ListBox>