Как сделать переключение между listbox c wpf

от admin

WPF Single selection between two ListBoxes

I’m having the following problem: I have two ListBox , with two different ItemSource , but both of them have the same binding for the SelectedItem , because I was trying to perform a single selection between these two lists.

Here’s an image that better shows the problem:

What would I like to do? Every time I select one item from the first list (in red), it should deselect the SelectedItem from the second list (in black), and vice versa. That’s why I’m using the same binding for both of them. I really don’t know if it’s the better way to do it, but it should work like that.

Как сделать переключение между listbox c wpf

Эти элементы представлены в WPF довольно широко. Все они являются производными от класса ItemsControl , который в свою очередь является наследником класса Control. Все они содержат коллекцию элементов. Элементы могут быть напрямую добавлены в коллекцию, возможна также привязка некоторого массива данных к коллекции.

Возьмем простейший элемент-список — ListBox и определим в файле MainWindow.xaml следующий интерфейс:

Элемент ItemsControl и списки в WPF и C#

Все элементы, размещенные внутри спискового элемента ListBox, представляют элементы списка.

Управление списком

Коллекция объектов внутри элемента-списка доступна в виде свойства Items . Для управления элементами из этой коллекции мы можем использовать следующие методы:

Add(object item) : добавление элемента

Clear() : полная очистка коллекции

Insert(int index, object item) : вставка элемента по определенному индексу в коллекции

Remove(object item) : удаление элемента

RemoveAt(int index) : удаление элемента по индексу

А свойство Count позволяет узнать, сколько элементов в коллекции.

Например, оставим предыдущий интерфейс и в файле связанного кода MainWindow.xaml.cs добавим и удалим программно несколько элементов:

В данном случае добавляем и удаляем ряд элементов с помощью различных методов и в итоге получим следующий список:

Методы управления списком в ListBox в WPF и C#

При вызове методов, которые используют индексы, как выше методы RemoveAt(index) и Insert(index, object) , следует учитывать, что передаваемые индексы должны быть действительны. Естественно мы не можем удалить, к примеру, второй объект, если списке только один объект или вообще нет объектов. В этом случае мы можем проверять длину списка:

Отображение сложных данных

Списковые элементы могут отображать не только простые строки или числа, но и сложные данные. Например, создадим в коде новый класс Person:

Теперь создадим в xaml набор объектов этого класса Person и выведем в их в списке:

Поскольку мы используем класс, определенный в текущем проекте, то соответственно у нас обязательно должно быть подключено пространство имен проекте. В моем случае проект (и пространство имен) называется «MetanitApp». Соответственно у меня это пространство имен проецируется на префикс local :

В принципе по умолчанию WPF уже его подключает. После этого через префикс «local» можно обращаться к классу Person: «local:Person».

Кроме того, чтобы не возникало проблем с разметкой XAML, желательно сделать перестроение проекта. И в итоге ListBox выведет все объекты:

Вывод списка объектов в ListBox в WPF и C#

По умолчанию списковые элементы выводят то, что возвращает метод ToString() объекта. Именно для этой демонстрации и реализован данный метод в классе Person выше. Но также с помощью свойства DisplayMemberPath можно установить свойство объекта, значение которого будет отображаться в списке. Например, отобразим только имя:

Свойство DisplayMemberPath в ListBox в WPF и C#

В этом случае в коде C# таким же образом можно добавлять и удалять данные:

ItemsSource

Нам необязательно вручную заполнять значения элемента управления списком, так как мы можем установить свойство ItemsSource , задав в качестве параметра коллекцию, из которой будет формироваться элемент управления списком. Например, в коде xaml-разметки определим пустой список:

А в файле отделенного кода выполним наполнение списка:

Но стоит учитывать, что если мы наполняем элемент управления списком через свойство ItemsSource , то мы не сможем использовать выше рассмотренные методы Add/Remove/RemoveAt/Insert/Clear для добавления/удаления элементов списка. В этом случае для управления элементами непосредственно к самому источнику данных. Например, определим в коде xaml кнопку для добавления одного объекта:

По нажатию на кнопку будет вызываться метод Button_Click . И в файле связанного кода C# определим данный метод и наполним ListBox данными:

Здесь в качестве источника данных выступает список people, и из этого списка ListBox будет брать данные.

В обработчике нажатия кнопки добавляем в список people один объект Person для теста. Обратите внимание, что добавляем именно в стандартный список List<Person> , а не в ListBox. ListBox в данном случае просто отображает данные. Но чтобы ListBox обновил свое визуальное представление, после изменения списка people обновляем данные в ListBox:

Обновление данных в ListBox в WPF и C#

Стоит отметить, что если в качестве источника данных выступает ObservableCollection , то нам не надо вызывает отобновление данных списка, так как коллекция ObservableCollection сама извещает систему об изменениях.

Выбор элементов

Все элементы управления списками поддерживают выделение входящих элементов. Выделенный элемент(ы) можно получить с помощью свойств SelectedItem (SelectedItems), а получить индекс выделенного элемента — с помощью свойства SelectedIndex . Свойство SelectedValue позволяет получить значение выделенного элемента.

При выделении элемента в списке генерируется событие SelectionChanged , которое мы можем обработать. Например, возьмем предыдущий список:

Как сделать переключение между listbox c wpf

Запуск приложения по двойному клику.
У меня есть определенный формат файла .ferti,создал его я сам, я хочу чтобы по двойному клику моя.

Редактирование заголовка вкладки по двойному клику TabControl
Добрый день! Подскажите плиз, как сделать редактирование имени вкладки (Header) по двойному клику.

Сделать выборку в ListBox, в зависимости от выбора Item в другом ListBox’e?
Добрый всем день! Подскажите пожалуйста, как можно сделать выборку в listbox, в зависимости от.

По двойному клику по строке datagrid открывать новую форму
Не могу разобраться. Вот у меня есть датагрид, в нем отображаются строки с фио сотрудников. Хочу.

Сообщение от Sparrow44
Сообщение от Wanderer
Сообщение от Sparrow44

Model-View-ViewModel, http://msdn.microsoft.com/ru-r. 19663.aspx — если вы этого не знаете, значит вам это пока не надо . Хотя при разработке любого WPF приложения крайне рекомендуется применять именно его.

Суть в том, чтобы максимально отделить интерфейс от кода собственно приложения. На практике это выливается в то, что в коде окна не пишется вообще ничего. Есть отдельный ViewModel класс, в котором идет основная обработка данных выводящихся на экран, есть отдельный View xaml, в котором есть привязка к этим данным. Смена интерфейса производится просто сменой View, без каких-либо изменений во ViewModel.

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

The ListBox control

In the last article, we had a look at the ItemsControl, which is probably the simplest list in WPF. The ListBox control is the next control in line, which adds a bit more functionality. One of the main differences is the fact that the ListBox control actually deals with selections, allowing the end-user to select one or several items from the list and automatically giving visual feedback for it.

Here’s an example of a very simple ListBox control:

This is as simple as it gets: We declare a ListBox control, and inside of it, we declare three ListBoxItem’s, each with its own text. However, since the ListBoxItem is actually a ContentControl, we can define custom content for it:

For each of the ListBoxItem’s we now add a StackPanel, in which we add an Image and a TextBlock. This gives us full control of the content as well as the text rendering, as you can see from the screenshot, where different colors have been used for each of the numbers.

From the screenshot you might also notice another difference when comparing the ItemsControl to the ListBox: By default, a border is shown around the control, making it look like an actual control instead of just output.

Data binding the ListBox

Manually defining items for the ListBox makes for a fine first example, but most of the times, your ListBox controls will be filled with items from a data source using data binding. By default, if you bind a list of items to the ListBox, their ToString() method will be used to represent each item. This is rarely what you want, but fortunately, we can easily declare a template that will be used to render each item.

I have re-used the TODO based example from the ItemsControl article, where we build a cool TODO list using a simple Code-behind class and, in this case, a ListBox control for the visual representation. Here’s the example:

Читать:
Левково лагерь как распределяются отряды

All the magic happens in the ItemTemplate that we have defined for the ListBox. In there, we specify that each ListBox item should consist of a Grid, divided into two columns, with a TextBlock showing the title in the first and a ProgressBar showing the completion status in the second column. To get the values out, we use some very simple data binding, which is all explained in the data binding part of this tutorial.

In the Code-behind file, we have declared a very simple TodoItem class to hold each of our TODO items. In the constructor of the window, we initialize a list, add three TODO items to it and then assign it to the ItemsSource of the ListBox. The combination of the ItemsSource and the ItemTemplate we specified in the XAML part, this is all WPF need to render all of the items as a TODO list.

Please notice the HorizontalContentAlignment property that I set to Stretch on the ListBox. The default content alignment for a ListBox item is Left, which means that each item only takes up as much horizontal space as it needs. The result? Well, not quite what we want:

By using the Stretch alignment, each item is stretched to take up the full amount of available space, as you can see from the previous screenshot.

Working with ListBox selection

As mentioned, a key difference between the ItemsControl and the ListBox is that the ListBox handles and displays user selection for you. Therefore, a lot of ListBox question revolves around somehow working with the selection. To help with some of these questions, I have created a bigger example, showing you some selection related tricks:

As you can see, I have defined a range of buttons to the right of the ListBox, to either get or manipulate the selection. I’ve also changed the SelectionMode to Extended, to allow for the selection of multiple items. This can be done either programmatically, as I do in the example, or by the end-user, by holding down [Ctrl] or [Shift] while clicking on the items.

For each of the buttons, I have defined a click handler in the Code-behind. Each action should be pretty self-explanatory and the C# code used is fairly simple, but if you’re still in doubt, try running the example on your own machine and test out the various possibilities in the example.

Summary

The ListBox control is much like the ItemsControl and several of the same techniques can be used. The ListBox does offer a bit more functionality when compared to the ItemsControl, especially the selection handling. For even more functionality, like column headers, you should have a look at the ListView control, which is given a very thorough description later on in this tutorial with several articles explaining all the functionality.

WPF ListBox Selection

This post follows along using the example from the previous post. The series of posts can be found just to the right of this text in a box. Users select items in a ListBox, usually with a mouse. Whenever the selected item in the ListBox changes, the ListBox’s SelectionChanged event is raised. If you create an event handler in the code-behind, you can assign the name of the event handler to the event, and when the event is raised, the event handler is called. Your C# code runs. Here is an example of a ListBox with some items. When the item selected changes because a user has clicked on one of them, the Label above shows what they clicked on. Here is an example of a project I made called ListBoxSimple.

Here is what the program looks like after the user has made a selection. Notice that the Label at the top will reflect whatever the user selects in the list. The source of the data is the ListBox and the target is the Label. The name of the program is ListBoxSimple, which in the code below is the Title. You can change that to whatever you like. Also, you will notice that the list is “hardcoded” in the XAML shown below. What if you needed to populate the list with data from a database?

Here below is the C# code-behind.

Multiple Selections

By default, only a single item in a ListBox can be selected at any time. But there are several options allowing you to enable selection of multiple items from the ListBox. You set the selection mode with the SelectionMode property. The following are the possible values:

Single: The user can select only a single item from the list. This is the default.

Extended: The user can select multiple items from the list, but must hold down a special key to select items after the first one. − To select additional items after the first, the user must hold down the Ctrl key while selecting items. − To select a range of items, the user can select the first (or last) item and then, while holding down the Shift key, select the last (first) item. This selects all the items in between as well as the first and last items.

Multiple: The user can select multiple items from the list by just clicking them, without having to press any special keys to allow the multiple selection.

The only difference in the XAML is the SelectionMode property being set as shown below.

Как сделать переключение между listbox c wpf

Представляет собой обычный список. Содержит коллекцию элементов ListBoxItem, которые являются типичными элементами управления содержимым. Также ListBox может содержать любые другие элементы, например:

Элемент ListBox в WPF

Все эти элементы будут находиться в коллекции phonesList.Items и, таким образом, по счетчику можно к ним обращаться, например, phonesList.Items[0] — первый элемент ListBox, который в данном случае представляет TextBlock. Также мы можем установить элемент: phonesList.Items[2]=»LG G 4″;

Компонент ListBoxItem представляет элемент управления содержимым, поэтому также мы можем задавать через его свойство Content более сложные композиции элементов, например:

Мы можем использовать элементы как внутри элемента ListBoxItem, так и непосредственно вставляя их в список. Однако на следующем примере видно, что использование ListBoxItem имеет небольшое преимущество, так как мы можем задать некоторые дополнительные свойства, например, отступы.

Выделение элементов

ListBox поддерживает множественный выбор. Для этого нужно установить свойство SelectionMode=»Multiple» или SelectionMode=»Extended» . В последнем случае, чтобы выделить несколько элементов, необходимо держать нажатой клавишу Ctrl или Shift. По умолчанию SelectionMode=»Single» , то есть допускается только единственное выделение.

Включение кнопки в WPF в зависимости от ListBox.SelectedIndex

У меня довольно классическая ситуация с пользовательским интерфейсом — два ListBox с именем SelectedItems и AvailableItems — идея состоит в том, что элементы, которые вы уже выбрали, живут в SelectedItems , а элементы, доступные для добавления в SelectedItems (т.е. каждый элемент, которого там еще нет) живет в AvailableItems .

Кроме того, у меня есть < и > кнопки для перемещения текущего выбора из одного списка в другой (в дополнение к двойному щелчку, который отлично работает).

Возможно ли в WPF настроить стиль / триггер для включения или отключения кнопок перемещения в зависимости от того, что выбрано в ListBox? SelectedItems находится с левой стороны, поэтому < кнопка переместит выбранный AvailableItems в этот список. Однако, если ни один элемент не выбран ( AvailableItems.SelectedIndex == -1 ), Я хочу, чтобы эта кнопка была отключена ( IsEnabled == false ) — и наоборот для другого списка / кнопки.

Возможно ли это сделать непосредственно в XAML, или мне нужно создать сложную логику в коде, чтобы справиться с этим?

если под развлечением вы имеете в виду совершенно, совершенно ужасный, единственный способ сделать это хуже, если это будет с регулярным выражением, то да, это большое развлечение — Andrew Bullock

@Will Это хорошая аналогия, потому что я бы хотел разбить орехи резиновым молотком — Cranston

Похожие статьи