Следующее похоже на то, что я пытаюсь выполнить. Тем не менее, я получаю сообщение об ошибке
Недопустимое значение PropertyDescriptor.
в шаблоне Setter
. Я подозреваю, что это потому, что я не указал TargetType
для стиля
; однако, я не знаю тип контейнера для ItemsControl
.
<ItemsControl>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<TextBlock Text="Some Content Here" />
<ContentPresenter />
<Button Content="Edit" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ItemsControl.ItemContainerStyle>
<!-- heterogenous controls -->
<ItemsControl.Items>
<Button Content="Content 1" />
<TextBox Text="Content 2" />
<Label Content="Content 3" />
</ItemsControl.Items>
</ItemsControl>
Имя свойства можно дополнить именем типа:
<Setter Property="Control.Template">
Контейнер для ItemsControl
обычно является ContentPresenter
, но если дочерний элемент a UIElement
, тогда он не будет использовать контейнер. В этом случае все дочерние элементы являются элементами управления, поэтому ItemContainerStyle
будет применяться к ним напрямую. Если вы добавили элемент, отличный от UIElement
, этот установщик установит свойство Control.Template
в ContentPresenter
, что будет выполнено успешно, но не окажет никакого эффекта.
На самом деле, похоже, что вы хотите обернуть каждого дочернего элемента в контейнер, даже если они уже являются UIElement
. Для этого вам нужно будет использовать подкласс ItemsControl
. Вы можете использовать существующий, например ListBox
, или создать подкласс ItemsControl
и переопределить GetContainerForItemOverride
и IsItemItsOwnContainerOverride
, чтобы заключить элементы в свои собственные контейнер. Вы можете заключить их в ContentControl
, а затем использовать его как TargetType
для стиля Style
.
public class CustomItemsControl
: ItemsControl
{
protected override DependencyObject GetContainerForItemOverride()
{
return new ContentControl();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
// Even wrap other ContentControls
return false;
}
}
Вам также необходимо установить TargetType
в ControlTemplate
, чтобы ContentPresenter
привязывались к свойству Content
:
<ControlTemplate TargetType="ContentControl">