Можете ли вы добавить дополнительный элемент в связанный с данными элемент 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/