Можете ли вы добавить дополнительный элемент в ItemsControl с привязкой к данным в XAML? - PullRequest
15 голосов
/ 19 декабря 2008

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

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

Кроме того, добавление дополнительной кнопки после 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.

Ответы [ 2 ]

20 голосов
/ 19 декабря 2008

Для этой цели можно использовать класс 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>
17 голосов
/ 18 апреля 2009

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

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

внутри - или, скорее, это позволит вам, но вы ничего не получите от этого. Поскольку в исходном сообщении требовалось, чтобы - {Binding ВозможноAmounts} - а не привязка к 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/

...