ItemTemplate: ListBox против ItemsControl - PullRequest
       33

ItemTemplate: ListBox против ItemsControl

5 голосов
/ 13 августа 2010

Я довольно новичок в мире 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 * только 1033 *).

1 Ответ

17 голосов
/ 13 августа 2010

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

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

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

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

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

...