Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/30: Рейтинг темы: голосов - 30, средняя оценка - 4.60
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878

Как создать выпадающий список?

26.03.2015, 17:21. Показов 6123. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Windows 7, VS 2012, WPF.
(Опыта использования WPF у меня нет).

У сущности (POCO) есть строковое (один символ) свойство Position. Я хочу ограничить выбор выпадающим списком и одновременно вместо односимвольных кодов показывать пользователю осмысленные названия. Как это лучше всего сделать?

Я решил использовать ComboBox.

Для формирования списка я создал класс:
C#
1
2
3
4
5
6
7
    public class DictItem
    {
        public static readonly List<DictItem> PositionDict = new List<DictItem> {/* тут список */};
 
        public string Code { get; set; }
        public string Caption { get; set; }
    }
Я не нашёл нормального способа назначить список DictItem.PositionDict свойству ItemsSource комбобокса. В итоге пришлось добавить на страницу свойство
C#
1
        public List<DictItem> PositionDict { get { return DictItem.PositionDict ; } }
а в XAML написать
ItemsSource="{Binding PositionDict, RelativeSource={RelativeSource FindAncestor, AncestorType=Page}}"

При этом в списке вместо значений Caption почему-то отображались значения ToString() (то есть, имя класса DataItem). Пришлось заменить элегантное DisplayMemberPath="Caption" на громоздкое
XML
1
2
3
4
5
6
7
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Caption}" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
В форме поиска мне нужен такой список, но с возможностью задать значение null. Я нагуглил и попробовал несколько разных способов, но все они либо не подходили, либо не срабатывали. Например, вот это не работает:
XML
1
2
3
4
5
6
                <ComboBox.ItemsSource>
                    <CompositeCollection>
                        <data:DictItem Code="" Caption="any"></data:DictItem>
                        <CollectionContainer Collection="{Binding PositionDict, RelativeSource={RelativeSource FindAncestor, AncestorType=Page}}" />
                    </CompositeCollection>
                </ComboBox.ItemsSource>
(отображается только нул-элемент, сам список не отображается)

В итоге маячит перспектива добавлять нул-элемент в коде, для чего создать ещё одно свойство у страницы.

Какие есть стандартные способы для решения этой задачи?

Хотелось бы
1. в качестве источника данных использовать непосредственно (без дублирующего свойства в коде) DictItem.PositionDict (например, создать ресурс на странице)
2. для отображения использовать DisplayMemberPath, а не ItemTemplate
3. использовать ту же привязку и на форме поиска
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2015, 17:21
Ответы с готовыми решениями:

Выпадающий список как в Windows 8
здравствуйте, задача - сделать выпадающий список как на рисунке. Можно ли приспособить для этого какие нибудь стандартные metro-элементы?...

Выпадающий список
Есть форма, считывающая xml в datagrid: Запускается процесс формирования документа, по окончанию которого содержимое документа заливается в...

WPF выпадающий список с указанием количества текстовых боксов
Пару дней назад начал изучать WPF и еще слишком мало знаю, но очень нужно сделать чтобы пользователь мог выбирать размер матрицы от 2 до...

2
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
30.03.2015, 01:31  [ТС]
В принципе, я готов переписать свой код, касающийся этих комбобоксов, так как он мне всё равно не нравится. Поэтому, если ни у кого нет идей, как исправить мой, то предложите свой вариант работы с выпадающими списками.

з.ы. Я два дня в гугле провёл. но не нашёл ничего, что мне бы подошло.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
07.01.2023, 15:16
Цитата Сообщение от Shamil1 Посмотреть сообщение
30.03.2015
Тема старая, но может кто наткнётся и так же не найдёт ответа....

Цитата Сообщение от Shamil1 Посмотреть сообщение
1. в качестве источника данных использовать непосредственно (без дублирующего свойства в коде) DictItem.PositionDict (например, создать ресурс на странице)
Цитата Сообщение от Shamil1 Посмотреть сообщение
...В итоге пришлось добавить на страницу свойство
....
а в XAML написать
ItemsSource="{Binding PositionDict, RelativeSource={RelativeSource FindAncestor, AncestorType=Page}}"
Платформа GUI не указана.
Для WPF будет так: ItemsSource="{x:Static data:DictItem.PositionDict}"

Не во всех платформах есть x:Static. На UWP, вроде, его нет. И на некоторых может требоваться чтобы PositionDict было обязательно свойством.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Например, вот это не работает:
XML
1
                        <CollectionContainer Collection="{Binding PositionDict, RelativeSource={RelativeSource FindAncestor, AncestorType=Page}}" />
(отображается только нул-элемент, сам список не отображается)
CompositeCollection и CollectionContainer - это DependencyObject. И они не встраиваются в визуальное дерево. Поэтому и привязки по визуальному дереву в них не работают. Работают привязки только с явным заданием источника Source=....
Можно задать ссылку сразу на статическое свойство:
XML
1
  <CollectionContainer Collection="{x:Static data:DictItem.PositionDict}" />
Если же нужна именно привязка (например к свойству VM), то придётся использовать какой-то прокси.
В случае коллекций - можно CollectionViewSource.
XML
1
2
3
4
5
6
7
8
9
10
    <ComboBox ItemsSource="{DynamicResource items}">
        <ComboBox.Resources>
            <CollectionViewSource x:Key="source"
                                    Source="{Binding PositionDict, RelativeSource={RelativeSource FindAncestor, AncestorType=Page}}"/>
            <CompositeCollection x:Key="items">
                <data:DictItem Code="" Caption="any"></data:DictItem>
                <CollectionContainer Collection="{Binding Source, Source={StaticResource source}}" />
            </CompositeCollection>
        </ComboBox.Resources>
    </ComboBox>
Цитата Сообщение от Shamil1 Посмотреть сообщение
2. для отображения использовать DisplayMemberPath, а не ItemTemplate
Этого не понял.
По идее должно работать без ких-либо проблем.
Может вы как-то не так указывали? Перепутали регистр, раскладку?
XML
1
2
    <ComboBox ItemsSource="{DynamicResource items}"
              DisplayMemberPath="Caption">
Цитата Сообщение от Shamil1 Посмотреть сообщение
3. использовать ту же привязку и на форме поиска
"Ту же" - это какую?
Если коллекцию PositionDict - то через икс-статик можно использовать на любом уровне.
Если CollectionViewSource x:Key="source" с нулевым элементом - то объявите его в ресурсах App.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2023, 15:16
Помогаю со студенческими работами здесь

Как создать выпадающий список
помогите сделать кнопку, при нажатии будет всплывать список &lt;li&gt;. с помощью: hover нельзя так как должна работать на портативных...

Как создать выпадающий список?
есть две таблицы первая STUDENTS с полями id_students, fio_students, group, specialnost. Вторая group с полями id_group, f2. В поле f2 я...

Как создать выпадающий список по категории товаров
Как создать выпадающий список который будет брать название из категории,имеются три города Иванова-категория А,Москва категория B ,Казань...

Как в екселе можно создать выпадающий список?
Как в екселе можно создать выпадающий список: чтобы можно было встать на ячейку, нажать на 'треугольничек', появится выпадашка. Выбрать из...

Как создать виждет выпадающий список кнопок?
Подскажите как создать виждет подобного вида:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru