Можете ли вы добавить дополнительный элемент в связанный с данными элемент ItemsControl в XAML?

У меня есть ItemsControl, который привязан к списку decimal s. Мне нужно добавить один дополнительный элемент управления в ItemsControl (опция указать номер вручную). Есть ли способ сделать это в XAML? Я знаю, что могу вручную добавить элемент в код позади, но я пытаюсь понять WPF немного лучше и хочу посмотреть, есть ли декларативный способ сделать это.

Обратите внимание, что изменение списка, к которому я привязываюсь, так что он включает дополнительную кнопку (возможно, путем перехода на список string вместо decimal s) не является хорошей альтернативой, потому что я хочу присоединить для этой последней кнопки.

Кроме того, добавление дополнительной кнопки после ItemsControl тоже не является хорошим вариантом, потому что мой элемент управления использует UniformGrid, и мне нужен дополнительный элемент управления в той же сетке.

Вот мой XAML:

<ItemsControl ItemsSource="{Binding PossibleAmounts}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Name="ButtonsGrid">
            </UniformGrid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button>
                <TextBlock Text="{Binding StringFormat='\{0:C\}'}"/>
            </Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

В принципе, я хочу еще одну кнопку в UniformGrid.

Ответы

Ответ 1

С этой целью вы можете использовать класс CompositeCollection, он объединяет несколько коллекций или отдельных элементов в качестве элемента ItemsSource для элемента ItemsControl.

Хороший пример в статье MSDN, или вот еще один:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid.Resources>
        <x:Array x:Key="intData" Type="{x:Type sys:Int32}">
            <sys:Int32>1</sys:Int32>
            <sys:Int32>2</sys:Int32>
            <sys:Int32>3</sys:Int32>
        </x:Array>
        <x:Array x:Key="stringData" Type="{x:Type sys:String}">
            <sys:String>Do</sys:String>
            <sys:String>Re</sys:String>
            <sys:String>Mi</sys:String>
        </x:Array>
    </Grid.Resources>
    <ListBox>
        <ListBox.ItemsSource>
            <CompositeCollection>
                <CollectionContainer Collection="{StaticResource intData}"/>
                <CollectionContainer Collection="{StaticResource stringData}"/>
                <ListBoxItem>One more item!</ListBoxItem>
                <ListBoxItem>Two more items!</ListBoxItem>
            </CompositeCollection>
        </ListBox.ItemsSource>
    </ListBox>
</Grid>

Ответ 2

Проблема с CompositeCollection заключается в том, что он не наследует родительский элемент DataContext, поэтому вы не сможете писать:

<CollectionContainer Collection={Binding ...}" />

внутри него - или, скорее, это позволит вам, но вы ничего не получите. Поскольку исходное сообщение требовало, чтобы - {Binding PossibleAmounts} - вместо привязки к StaticResource - это не действительно решение.

См:

http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx

http://www.vistax64.com/avalon/90-compositecollections-collectioncontainer-binding-issue.html

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/bd1a78c1-67ef-4d1e-9cbe-70bbe8eb8b44/