WPF: работа с ListBox

ListBox — это элемент управления, представляющий собой список элементов. Каждый элемент коллекции представляет собой объект класса ListBoxItem и является типичным элементом управления содержимым. В этой статье рассмотрим некоторые типовые вопросы использования ListBox в WPF, а также разберем несколько вопросов, связанных с работой этого элемента управления с внешними данными.

Примеры создания ListBox в WPF (XAML)

Пример 1. ListBox, содержащий простые строки

Для начала, создадим ListBox, содержащий обычные строки (string). В XAML такой список может выглядеть следующим образом:

<ListBox>
    <ListBoxItem>Элемент 1</ListBoxItem>
    <ListBoxItem>Элемент 2</ListBoxItem>
    <ListBoxItem>Элемент 3</ListBoxItem>
    <ListBoxItem>Элемент 4</ListBoxItem>
    <ListBoxItem>Элемент 5</ListBoxItem>
</ListBox>

Соответственно, внешний вид запущенного приложения WPF будет следующим:

Элементы ListBoxItem могут содержать в себе и другие вложенные элементы. Рассмотрим пример посложнее.

Пример 1. ListBox, содержащий другие элементы управления

Создадим ListBox, в котором каждый элемент будет состоять из двух элементов TextBlock.

<ListBox>
    <ListBoxItem>
        <StackPanel>
            <TextBlock FontSize="16" FontStyle="Italic" FontFamily="Arial Black" FontWeight="Bold" >Элемент 1</TextBlock>
            <TextBlock FontSize="12" FontWeight="Light">Подзаголовок</TextBlock>
        </StackPanel>                        
    </ListBoxItem>
    <ListBoxItem>
        <StackPanel>
            <TextBlock FontSize="16" FontStyle="Italic" FontFamily="Arial Black" FontWeight="Bold" >Элемент 2</TextBlock>
            <TextBlock FontSize="12" FontWeight="Light">Подзаголовок</TextBlock>
        </StackPanel>
    </ListBoxItem>
    <ListBoxItem>
        <StackPanel>
            <TextBlock FontSize="16" FontStyle="Italic" FontFamily="Arial Black" FontWeight="Bold" >Элемент 3</TextBlock>
            <TextBlock FontSize="12" FontWeight="Light">Подзаголовок</TextBlock>
        </StackPanel>
    </ListBoxItem>
</ListBox>

В этом примере мы создали ListBox, в котором каждый элемент — это StackPanel, содержащая по два элемента TextBlock и, при этом, один TextBlock выступает в качестве заголовка элемента, а второй — содержит обычный текст. В запущенном приложении этот ListBox будет выглядеть следующим образом:

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

Доступ к элементам в ListBox

Пример 3. Получение строки из ListBoxItem

Попробуем получить строки из элементов ListBox, который мы создавали в примере №1. Допустим, нам необходимо вывести сообщение (MessageBox) с текстом элемента при клике мышкой по нему. Доработаем наш ListBox следующим образом:

<ListBox x:Name="simpleList">
    <ListBoxItem Content="Элемент 1"/>
    <ListBoxItem Content="Элемент 2"/>
    <ListBoxItem Content="Элемент 3"/>
    <ListBoxItem Content="Элемент 4"/>
    <ListBoxItem Content="Элемент 5"/>
</ListBox>

Теперь создадим обработчик события MouseUp у ListBox:

private void simpleList_MouseUp(object sender, MouseButtonEventArgs e)
{
    if (simpleList.SelectedItem != null)
    {
        ListBoxItem li = (ListBoxItem)simpleList.Items[simpleList.SelectedIndex];//получаем доступ к элементу
        MessageBox.Show((string)li.Content);//получаем текст
    }
}

Итоговый код ListBox в XAML должен получиться вот таким:

<ListBox x:Name="simpleList" MouseUp="simpleList_MouseUp">
    <ListBoxItem Content="Элемент 1"/>
    <ListBoxItem Content="Элемент 2"/>
    <ListBoxItem Content="Элемент 3"/>
    <ListBoxItem Content="Элемент 4"/>
    <ListBoxItem Content="Элемент 5"/>
</ListBox>

Результат работы программы показан на рисунке ниже:

Теперь рассмотрим второй ListBox и попробуем добраться до текста элементов, состоящих из отдельных TextBlock.

Пример 4. Получение доступа к элементам ListBox

Основная сложность заключается в том, чтобы правильно добраться до нужного нам TextBlock. Для ListBox приведенного в примере 2 это можно сделать следующим образом:

if (!(sender is ListBox))
    return;
ListBox list = (ListBox)sender; //получаем ListBox            
ListBoxItem item = (ListBoxItem)list.Items[list.SelectedIndex];//получаем доступ к выделенному элементу
StackPanel panel = (StackPanel)item.Content; //получаем доступ к панели
string result = ""; 
foreach (UIElement element in panel.Children)
{
    if (element is TextBlock block) //проверяем, является ли текущий элемент панели текстовым блоком
    {
        result += block.Text;
        result += ".";
    }
}
MessageBox.Show(result);

Результат работы программы представлен на рисунке ниже:

Загрузка данных в ListBox из XML-файла

Довольно часто необходимо подгружать данные в ListBox из внешних источников данных, например из XML-файла. Рассмотрим пример того, как можно получить данные в ListBox из внешнего файла.

Создаем XML-файл

В принципе, XML-файл может быть какой угодно, главное, чтобы вы сами знали, какие именно данные необходимо из него получить. Например, создадим XML-файл, содержащий информацию по людям:

<?xml version="1.0" encoding="utf-8" ?>
<people>
    <person>
        <fullName>Пупкин Вася</fullName>
        <position>Дворник</position>
        <phone>+1(123)23345678</phone>
    </person>
    <person>
        <fullName>Иванов Петя</fullName>
        <position>Программист</position>
        <phone>+1(123)55545678</phone>
    </person>
    <person>
        <fullName>Петров Вова</fullName>
        <position>Директор</position>
        <phone>+1(123)55545999</phone>
    </person>
</people>

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

Выделите в обозревателе решений файл peoples.xml и в свойствах установите следующие его свойства, как показано на рисунке:

Теперь мы можем подгружать из этого файла данные в ListBox.

Загружаем данные из XML-файла в ListBox (XmlDataProvider)

Класс XmlDataProvider используется для подключения к xml-документам. При этом xml-документ может быть как локальным xml-файлом, так и и xml-данными из Сети. Для связи с источником данных XmlDataProvider использует следующие свойства:

  • Source: устанавливает источник данных
  • XPath: задает путь внутри документа xml к целевому набору данных
  • Document: устанавливает ссылку на xml-документ
  • IsAsynchronous: при значении true загружает данные асинхронно

Теперь обратимся к нашему XML-файлу, используя XmlDataProvider. Для этого в XAML добавим следующий код:

<Window.Resources>
    <XmlDataProvider x:Key="peopleProvider" Source="peoples.xml" XPath="people" />
</Window.Resources>

XmlDataProvider определяется в XAML как ресурс, а его свойству Source присваивается путь к xml-файлу. Свойство XPath указывает, что все данные для провайдера в файле будут расположены в рамках элемента <people>.

Теперь загрузим данные в ListBox. Для этого у ListBox допишем следующие свойства:

<ListBox x:Name="xmlList" 
         ItemsSource="{Binding Source={StaticResource peopleProvider}, XPath=person}" 
         DisplayMemberPath="fullName" />

Таким образом, мы указали, что данные для каждого элемента ListBox будут браться из узла person в XML-файле и отображаться будет значение из узла fullName. В рабочем приложении это будет выглядеть следующим образом:

Итого

Сегодня мы узнали основные моменты по работе с ListBox в WPF, научились создавать ListBox, содержащий строки, а также другие элементы управления. Также мы рассмотрели вопрос того, каким образом можно загрузить данные из XML-файла в ListBox, используя возможности XAML.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии