У меня есть пользовательский элемент управления, который имеет ContentPresenter, которому установят произвольный объект как его содержание. Этот объект не имеет никакого ограничения на свой тип, таким образом, я хочу, чтобы это управление отобразило свое на основе содержимого на любых шаблонах данных, определенных приложением или шаблонами данных, определенными в Generic.xaml. Если в приложении я определяю некоторый шаблон данных (без ключа, потому что я хочу, чтобы он был применен автоматически к объектам того типа), и я использую пользовательский элемент управления, связанный с объектом того типа, шаблон данных применяется автоматически. Но у меня есть некоторые шаблоны данных, определенные для некоторых типов в generic.xaml, где я определяю стиль пользовательского элемента управления, и эти шаблоны не становятся прикладными автоматически. Вот generic.xaml:
<DataTemplate DataType="{x:Type PredefinedType>
<!-- template definition -->
<DataTemplate>
<Style TargetType="{x:Type CustomControl}">
<!-- control style -->
</Style>
Если я установил объект типа 'PredefinedType' как содержание в contentpresenter, шаблон данных не становится прикладным. Однако, Если это работает, если я определяю шаблон данных в app.xaml для приложения, это использует пользовательский элемент управления.
Кто-то получил подсказку? Я действительно наклоняюсь, предполагают, что пользователь управления определит этот шаблон данных, таким образом, мне будет нужен некоторый способ связать его пользовательским элементом управления.
Ресурсы, объявленные в Generic.xaml, подтягиваются, только если на них непосредственно ссылается шаблон, применяемый к элементу управления (обычно с помощью ссылки StaticResource). В данном случае вы не можете установить прямую ссылку, поэтому вам нужно использовать другой метод для упаковки DataTemplates с вашим ControlTemplate. Вы можете сделать это, включив их в более локальную коллекцию Resources, например ControlTemplate.Resources:
<Style TargetType="{x:Type local:MyControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyControl}">
<ControlTemplate.Resources>
<DataTemplate DataType="{x:Type local:MyDataObject}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ControlTemplate.Resources>
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>