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





Вы захотите добавить 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>
Хорошо, у меня все заработало, но мне нужно было внести одно исправление. Я собираюсь опубликовать это в своем первоначальном вопросе.
Ах да, я забыл свойство привязки ItemTemplate. Я тоже исправлю свой ответ.
это не так плохо, как я представлял. Я приму предложение после того, как смогу убедиться, что это работает.