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

У меня есть 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
8 676
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для этой цели вы можете использовать класс 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>

Блестяще! Не ожидал, что такая вещь будет реализована как стандартная функция в WPF!

Dmitry Tashkinov 17.09.2010 18:13

Есть ли альтернатива WindowsRT? Я не вижу CompositeCollection в XAML приложения Win8, поэтому предполагаю, что сам объект недоступен ...

Shaamaan 26.01.2016 16:15

Однако проблема с 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/

Эта проблема решается путем добавления к ресурсам объекта freezable, который хранит привязку и служит источником для привязки свойства коллекции.

Dmitry Tashkinov 17.09.2010 19:40

@DmitryTashkinov было бы интересно объяснить почему.

ANeves thinks SE is evil 21.05.2015 19:24

@DmitryTashkinov Не могли бы вы рассказать немного, как мы можем этого добиться?

Amir Mahdi Nassiri 14.06.2018 19:25

Ой, ребята, прошли годы. Так почему бы вам не добавить ресурс <CollectionViewSource x: Key = "ExtraItems" Source = "{Binding Items}" /> и внутри CompositeCollection добавить <CollectionContainer Collection = "{Binding Source = {StaticResource ExtraItems}}" />

Dmitry Tashkinov 15.06.2018 12:15

Ссылаясь на комментарий @DmitryTashkinov о freezable - см. stackoverflow.com/questions/2692175/freezable-datacontext, stackoverflow.com/questions/26364979/…, stackoverflow.com/questions/19144410/…

StayOnTarget 16.06.2020 17:05

Другие вопросы по теме