Пользовательский элемент управления WPF с шаблонами элементов/данных

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

У меня есть пользовательский элемент управления, представляющий собой смесь нескольких других элементов управления WPF, одним из которых является ListBox. Я хотел бы, чтобы пользователь элемента управления указал содержимое списка, но я не уверен, как передать эту информацию.

РЕДАКТИРОВАТЬ: принятый ответ работает со следующей коррекцией:

<UserControl x:Class="WpfApplication6.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:src="clr-namespace:WpfApplication6">
    <ListBox ItemTemplate="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:MyControl}}, Path=ItemsSource}" />
</UserControl>

person Justin Bozonier    schedule 10.11.2008    source источник


Ответы (1)


Вы захотите добавить DependencyProperty в свой элемент управления. XAML будет выглядеть немного иначе, если вы наследуете от UserControl или Control.

public partial class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty ItemTemplateProperty =
        DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(MyControl), new UIPropertyMetadata(null));
    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate) GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }
}

Вот xaml для UserControl.

<UserControl x:Class="WpfApplication6.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:src="clr-namespace:WpfApplication6">
    <ListBox ItemTemplate="{Binding ItemTemplate, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:MyControl}}}" />
</UserControl>

Вот xaml для элемента управления:

<Style TargetType="{x:Type src:MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type src:MyControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">

                    <ListBox ItemTemplate="{TemplateBinding ItemTemplate}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
person Todd White    schedule 10.11.2008
comment
это не так уж и плохо, как я представлял. Я соглашусь после того, как смогу убедиться, что это работает. - person Justin Bozonier; 11.11.2008
comment
Хорошо, у меня это работает, но мне нужно было внести одно исправление. Я собираюсь опубликовать это в своем первоначальном вопросе. - person Justin Bozonier; 11.11.2008
comment
Ах да, я забыл свойство привязки ItemTemplate. Я тоже исправлю свой ответ. - person Todd White; 11.11.2008