ItemTemplate: ListBox против ItemsControl

Я новичок в мире WPF, и у меня возникли проблемы с шаблонами элементов в ItemsControl. Что мне нужно, так это элементы шаблона (в основном кнопки) внутри ItemsControl (или тому подобное).

Если я использую следующий код XAML ...

<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type Button}">
                <Border BorderBrush="AliceBlue" 
                        BorderThickness="3">
                    <TextBlock Text="Templated!"/>        
                </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <Button>Not templated</Button>
    <TextBlock>Text not templated</TextBlock>
</ItemsControl>

... Получаю такой результат: http://img444.imageshack.us/img444/2167/itemscontrolnottemplate.gif

Элемент ItemsControl не применил шаблон ни к Button, ни к элементу управления TextBlock. Если я изменю ItemsControl на ListBox следующим образом:

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type Button}">
                <Border BorderBrush="AliceBlue" 
                        BorderThickness="3">
                    <TextBlock Text="Templated!"/>        
                </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <Button>Not templated</Button>
    <TextBlock>Text not templated</TextBlock>
</ListBox>

... тогда я получаю такой результат: img814.imageshack.us/img814/6204/listboxtoomuchtemplatin.gif

Теперь шаблон применяется к ОБЕИМ дочерним элементам управления (даже если я установил для DataType значение только Button).


person null    schedule 13.08.2010    source источник


Ответы (1)


Трудно понять, что вы пытаетесь сделать, но посмотрите, поможет ли это ...

Простой старый ItemsControl не будет оборачивать своих дочерних элементов в контейнер, если они уже являются элементами пользовательского интерфейса. С другой стороны, ListBox требует, чтобы его дочерние элементы были заключены в ListBoxItem.

Если элемент обернут, применяется ItemTemplate. Если элемент не упакован, ItemTemplate также может не существовать.

Вы почти всегда хотите добавлять элементы данных в свои ItemsControl, а не элементы пользовательского интерфейса. Затем вы связываете DataTemplates с этими элементами данных, чтобы определить, какие элементы пользовательского интерфейса используются для их визуализации.

Я думаю, что объяснение вашей конечной цели поможет в дальнейшем.

person Kent Boogaart    schedule 13.08.2010