Как может шаблоны данных в generic.xaml применяться автоматически?

У меня есть пользовательский элемент управления, который имеет 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 для приложения, это использует пользовательский элемент управления.

Кто-то получил подсказку? Я действительно наклоняюсь, предполагают, что пользователь управления определит этот шаблон данных, таким образом, мне будет нужен некоторый способ связать его пользовательским элементом управления.

5
задан Joey 12 March 2018 в 16:02
поделиться

1 ответ

Ресурсы, объявленные в 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>
5
ответ дан 14 December 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: