Укажите ControlTemplate для ItemsControl.ItemContainerStyle

Следующее похоже на то, что я пытаюсь выполнить. Тем не менее, я получаю сообщение об ошибке

Недопустимое значение 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>
21
задан M463 25 September 2015 в 09:06
поделиться

1 ответ

Имя свойства можно дополнить именем типа:

<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">
40
ответ дан 29 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

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