@ Fragilerus и @Liz, на самом деле я думаю, что придумал что-то лучшее. Вот еще один подход, который не только избегает дополнительной привязки ContentPresenter, но также устраняет необходимость применения шаблона в шаблоне, поскольку разделяемый контент - это прямой контент, который устанавливается во время компиляции. Единственное, что происходит во время выполнения, это привязки, которые вы устанавливаете в прямом контенте. Таким образом, это значительно ускоряет интерфейс по сравнению с другим решением.
<!-- Content for the template (note: not a template itself) -->
<Border x:Shared="False"
x:Key="Foo"
BorderBrush="Red"
BorderThickness="1"
CornerRadius="4">
<TextBlock Text="{Binding SomeProp}" />
</Border>
<DataTemplate x:Key="TemplateA">
<!-- Static resource - No binding needed -->
<ContentPresenter Content="{StaticResource Foo}" />
</DataTemplate>
<DataTemplate x:Key="TemplateB">
<!-- Static resource - No binding needed -->
<ContentPresenter Content="{StaticResource Foo}" />
</DataTemplate>
Внимание! Обязательно используйте атрибут x:Shared
в общедоступном контенте, иначе он не будет работать.
WPF'y Way
Выше было сказано, что это не самый удобный способ для WPF делать то, что вам нужно. Это может быть достигнуто с помощью класса DataTemplateSelector, который делает именно это ... выбирает шаблон данных на основе установленных вами критериев.
Например, вы можете легко настроить тот, который ищет ваши известные типы данных и возвращает один и тот же DataTemplate для них обоих, но для всех других типов он обращается к системе для разрешения DataTemplate. Вот что мы на самом деле делаем здесь.
Надеюсь, это поможет! :)