Как шаблоны данных в generic.xaml могут применяться автоматически? - PullRequest
5 голосов
/ 02 мая 2010

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

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

1 Ответ

4 голосов
/ 02 мая 2010

Ресурсы, объявленные в Generic.xaml, извлекаются только в том случае, если на них непосредственно ссылается шаблон, применяемый к элементу управления (обычно посредством ссылки на StaticResource). В этом случае вы не можете установить прямую ссылку, поэтому вам нужно использовать другой метод для упаковки DataTemplates с вашим ControlTemplate. Вы можете сделать это, включив их в более локальную коллекцию ресурсов, например 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>
...