Курс лекций для студентов специальности 1-40 01 03 Информатика и технологии программирования Минск 2013



страница22/22
Дата09.08.2018
Размер1.9 Mb.
#43657
ТипКурс лекций
1   ...   14   15   16   17   18   19   20   21   22

























13.2. Настройка внешнего вида списков


Класс ItemsControl обладает набором свойств, позволяющих гибко настроить внешний вид любого списка:

Template – шаблон списка как элемента управления. Чтобы отображать данные, помещённые в список, шаблон должен содержать ItemsPresenter или контейнер компоновки, у которого свойство IsItemsHost равно true.

ItemsPanel – контейнер компоновки для элементов списка.

ItemContainerStyle – стиль контейнера, обрамляющего элемент списка.

ItemContainerStyleSelector – объект класса-наследника StyleSelector с методом выбора стиля для ItemContainerStyle.

ItemTemplate – шаблон данных, используемый для отображения отдельного элемента списка.

ItemTemplateSelector – объект класса-наследника DataTemplateSelector с методом выбора шаблона для ItemTemplate.

Рис 48. Структура списка.

Если у списка установлено свойство ItemContainerStyle, то он передаст этот стиль каждому своему элементу при его создании (в случае ListBox каждый элемент – это объект ListBoxItem). Ниже показана разметка и эффект применения ItemsContainerStyle для списка. Обратите внимание на триггер, срабатывающий при выделении элемента.

<Window.Resources>

Color="DarkRed" />







изменения в описании ListBox -->

ItemContainerStyle="{StaticResource normal}" />



Рис. 49. Список с установленным свойством ItemContainerStyle.

При помощи селекторов стилей реализуется возможность менять стиль элемента списка на основе элемента данных. Селектор стилей – класс, унаследованный от StyleSelector, с перекрытым методом SelectStyle(). Для рассматриваемого примера создадим селектор стилей, выделяющий «агентов».
public class AgentStyleSelector : StyleSelector

{

public Style NormalStyle { get; set; }



public Style AgentStyle { get; set; }

public override Style SelectStyle(object item,

DependencyObject container)

{

var person = (Person) item;



return person.Name.StartsWith("Agent") ? AgentStyle :

NormalStyle;

}

}

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



<Window.Resources>







настройка ListBox -->





NormalStyle="{StaticResource normal}"

AgentStyle="{StaticResource agent}" />





Рис. 50. Селектор стилей в действии.

Процесс выбора стилей выполняется, когда список привязывается в первый раз. Это становится проблемой, когда в результате редактирования какой-то элемент данных перемещается из одной категории стиля в другую. В такой ситуации нужно заново применить стили. При этом проверяется и обновляется каждый элемент в списке – процесс, не занимающий много времени в списках малых и средних размеров. Простой подход состоит в удалении селектора стиля установкой свойства ItemContainerStyleSelector в null, с последующим его переназначением:

StyleSelector selector = lst.ItemContainerStyleSelector;

lst.ItemContainerStyleSelector = null;

lst.ItemContainerStyleSelector = selector;

Можно организовать запуск этого кода автоматически в ответ на определённые изменения, обрабатывая такие события, как PropertyChanged (объявлено в INotifyPropertyChanged) или Binding.SourceUpdated.

Изменить состав отображаемой в элементе списка информации помогают шаблоны данных. Для установки шаблона данных можно использовать свойство списка ItemTemplate или свойство шаблона DataTemplate (глобальный шаблон). У списка также имеется свойство ItemTemplateSelector для задания селектора шаблонов (работает так же, как и селектор стилей).



// селектор шаблона данных

public class AgentTemplateSelector : DataTemplateSelector

{

public DataTemplate NormalTemplate { get; set; }



public DataTemplate AgentTemplate { get; set; }

public override DataTemplate SelectTemplate(object item,

DependencyObject container)

{

var person = item as Person;



return person == null ? null :

(person.Name.StartsWith("Agent") ? AgentTemplate :

NormalTemplate);

}

}



описание шаблонов данных в ресурсах -->





CornerRadius="2" Padding="3" Margin="3">





Text="{Binding Name}" />













CornerRadius="2" Padding="3" Margin="3">



Text="{Binding Name}" />







Window.Resources>





NormalTemplate="{StaticResource normal}"

AgentTemplate="{StaticResource agent}" />





Рис. 51. Список с шаблонами данных.

Стили элемента, шаблоны данных и селекторы дают достаточный контроль над всеми аспектами представления элемента. Однако они не позволяют изменить организацию элементов относительно друг друга. Независимо от того, какие шаблоны и стили применяются, ListBox поместит каждый элемент в отдельную горизонтальную строку и сложит строки друг на друга в стопку, формируя список.

Эту компоновку можно изменить, заменив контейнер, который используется списком для организации своих дочерних элементов. Для этого необходимо установить свойство ItemsPanel. В следующем фрагменте разметки применяется WrapPanel в качестве оболочки вокруг доступной ширины элемента управления ListBox:



ScrollViewer.HorizontalScrollBarVisibility="Disabled">















Рис. 52. Изменение контейнера компоновки элементов.

Большинство списочных элементов управления используют в качестве контейнера для компоновки VirtualizingStackPanel. Этот контейнер гарантирует эффективную обработку больших списков привязанных данных. Он создаёт только те элементы, которые необходимы для отображения набора текущих видимых элементов.

13.3. Представления коллекций


При выполнении привязки коллекции к списковому элементу управления WPF использует специальный объект, созданный на основе коллекции и называемый представлением коллекции (collection view). Представление позволяет фильтровать, сортировать и группировать данные коллекции и даёт возможность навигации по коллекции.

Представления построены на основе интерфейса ICollectionView из пространства имён System.ComponentModel. Этот интерфейс унаследован от IEnumerable и INotifyCollectionChanged. Его элементы отписаны в табл. 9.

Таблица 9

Элементы интерфейса ICollectionView



Имя

Описание

CanFilter,

CanGroup,

CanSort


Булевы свойства, которые указывают на поддержку представлением фильтрации, группировки и сортировки

Contains()

Метод для проверки вхождения элемента в представление

Culture

Объект, описывающий региональные стандарты (используется при сортировке представления)

CurrentChanging,

CurrentChanged



События, генерируемые при изменении позиции элемента

CurrentItem,

CurrentPosition



Текущий элемент представления и его позиция

Filter

Функция фильтрации, описанная как Predicate<object>

GroupDescriptions

Коллекция объектов GroupDescription, описывающих условия группировки данных

Groups

Коллекция групп, имеющихся в представлении

IsCurrentAfterLast,

IsCurrentBeforeFirst



Булевы свойства, указывающие на то, что текущий элемент представления вышел за пределы инкапсулируемой коллекции

IsEmpty

Свойство равно true, если представление не содержит данных

MoveCurrentTo(),

MoveCurrentToPosition(),

MoveCurrentToFirst(),

MoveCurrentToLast(),

MoveCurrentToNext(),

MoveCurrentToPrevious()



Эти методы предназначены для изменения позиции текущего элемента представления

Refresh()

Метод для повторного создания представления по коллекции

SortDescriptions

Коллекция объектов SortDescription, описывающих критерии сортировки данных представления

SourceCollection

Коллекция, инкапсулируемая представлением

Существует четыре стандартных класса, реализующих ICollectionView: CollectionView, ListCollectionView, BindingListCollectionView (все три из пространства имён System.Windows.Data) и класс ItemCollection (пространство имён System.Windows.Controls). Выбор класса для представления диктуется источником данных:

1. Если источник данных реализует интерфейс IBindingList, создаётся объект BindingListCollectionView. Это происходит, когда источником является объект DataTable. Представления BindingListCollectionView не поддерживают фильтрацию через свойство Filter, но определяют специальное строковое свойство CustomFilter.

2. Если источник данных реализует IList, создаётся объект представления ListCollectionView.

3. Если источник данных реализует только интерфейс IEnumerable, создаётся простейший объект представления CollectionView. Представления этого типа не поддерживают группировку.

Реализуем при помощи представлений фильтр по возрасту. В случае, когда списковый элемент управления уже связан с коллекцией данных, получить представление можно из свойства Items списка (тип этого свойства – ItemCollection). Добавим в окно кнопку установки фильтра и кнопку сброса фильтра. Обработчики кнопок показаны ниже:

// обработчик для кнопки установки фильтра

private void btnAge_Click(object sender, RoutedEventArgs e)

{

// получаем представление у списка lst



ICollectionView view = lst.Items;

// устанавливаем фильтр, используя лямбда-выражение

view.Filter = p => ((Person) p).Age > 33;

}

// обработчик для кнопки сброса фильтра

private void btnReset_Click(object sender, RoutedEventArgs e)

{

ICollectionView view = lst.Items;



// чтобы сбросить фильтр, достаточно присвоить ему null

view.Filter = null;

}

Используем представление, чтобы выполнить сортировку по возрасту. Отдельный критерий сортировки описывается при помощи структуры System.ComponentModel.SortDescription. При этом указывается имя поля сортировки и направление сортировки (по возрастанию или по убыванию). Представление хранит все критерии сортировки в коллекции SortDescriptions. Ниже показан код обработчика для кнопки сортировки:



private void btnSort_Click(object sender, RoutedEventArgs e)

{

ICollectionView view = lst.Items;



view.SortDescriptions.Add(new SortDescription("Age",

ListSortDirection.Ascending));

}

Заметим, что если используется представление типа ListCollectionView, сортировку можно выполнить при помощи свойства CustomSort, которое принимает объект IComparer.



Представления позволяют группировать данные коллекции. Для этого нужно добавить объекты PropertyGroupDescription (пространство имён System.Windows.Data) в коллекцию представления GroupDescriptions:

private void btnGroup_Click(object sender, RoutedEventArgs e)

{

ICollectionView view = lst.Items;



var desc = new PropertyGroupDescription {PropertyName = "Age"};

view.GroupDescriptions.Add(desc);

}

Когда используется группировка, для каждой группы создаётся отдельный объект GroupItem, и все эти объекты добавляются в список. Сделать группы видимыми можно, отформатировав элемент GroupItem. Класс ItemsControl имеет свойство GroupStyle, которое предоставляет коллекцию объектов GroupStyle. Каждый объект GroupStyle описывает стиль для отдельного уровня группировки. Несмотря на имя, класс GroupStyle стилем не является. Он представляет собой удобный пакет, содержащий несколько полезных параметров для конфигурирования GroupItem:



ContainerStyle – стиль для элемента GroupItem;

ContainerStyleSelector – селектор стиля для GroupItem;

HeaderTemplate – шаблон для отображения в начале каждой группы;

HeaderTemplateSelector – селектор шаблона HeaderTemplate;

HidesIfEmpty – булево свойство, используемое для сокрытия пустых групп.

Чтобы добавить заголовок для группы, нужно установить свойство GroupStyle.HeaderTemplate. Свойство является обычным шаблоном данных. Если в шаблоне будет использоваться привязка данных, её нужно выполнять относительно предназначенного для группы объекта PropertyGroupDescription.











FontSize="14" FontWeight="Bold" Padding="3"

Foreground="White" Background="Green" />











Рис. 53. Группировка списка.

Класс System.Windows.Data.CollectionViewSource – вспомогательный класс для работы с представлениями, который удобно использовать в разметке XAML1. Двумя наиболее важными свойствами этого класса являются свойство View, которое упаковывает объект представления, и свойство Source, которое указывает на источник данных. У него также имеются свойства SortDescriptions и GroupDescriptions для сортировки и группировки коллекции, и событие Filter, которое можно использовать для выполнения фильтрации. Статический метод CollectionViewSource.GetDefaultView() позволяет получить представление для указанной коллекции.

Литература


1. Андерсон, К. Основы Windows Presentation Foundation / К. Андерсон. – М.: ДМК Пресс, Спб.: БХВ-Петербург, 2008. – 432 с.: ил.

2. Мак-Дональд, М. WPF 4: Windows Presentation Foundation в .NET 4.0 с примерами на C# 2010 для профессионалов / М. Мак-Дональд. – М. : Издат. дом «Вильямс», 2011. – 1024 с.

3. Натан, А. WPF 4. Подробное руководство / А. Натан. – Спб.: Символ-Плюс, 2012. – 880 с.

4. Петцольд, Ч. Microsoft Windows Presentation Foundation / Ч. Петцольд. – М.: Издательство «Русская Редакция»; СПб.: Питер, 2008. – 944 с.: ил.



5. Троелсен, Э. Язык программирования C# 5.0 и платформа .NET 4.5 / Э. Троелсен. – 6-е изд. – М.: ООО «И.Д. Вильямс», 2013. – 1312 с.: ил.

1 Произносится как [ˈzæməl].

1 При одновременной установке Canvas.Left имеет преимущество перед Canvas.Right, а Canvas.Top – перед Canvas.Bottom.

1 Классы, унаследованные от UIElement, обладают булевым свойством ClipToBounds. Если в родительском элементе это свойство установлено в true, визуальное содержимое дочерних элементов отсекается при выходе за границы родителя.

1 Класс RibbonWindow описывает окно специального вида, используемое совместно с лентой.

1 Если файл ресурса не связывался со сборкой при компиляции, можно использовать обычный URI (путь к файлу на локальной или сетевой машине, адрес в интернет).

1 Если свойство LinearGradientBrush.MappingMode установить в MappingMode.Absolute, для вектора градиента будут использоваться абсолютные координаты.

1 Свойство Style – это не единственное «стилевое» свойство. Класс FrameworkElement имеет свойство FocusVisualStyle – стиль, применяемый при получении фокуса ввода. Класс ItemsControl имеет свойство ItemContainerStyle – стиль, применяемый к каждому элементу списка.

1 В примере можно использовать обычный триггер свойства, ведь TextBox.Text – свойство зависимостей.

1 В составе Expression Blend имеется демонстрационный проект SimpleStyles, который предоставляет коллекцию простых, отлаженных шаблонов для всех стандартных элементов управления WPF. SimpleStyles – это отправная точка для создания собственных шаблонов.

1 Если планируется использование объекта CollectionViewSource, привязка должна выполняться непосредственно к этому объекту, а не к его свойству View.

Каталог: images
images -> В списке студентов (или магистрантов)
images -> Н. И. Сулейманов Комплект контрольно-оценочных средств для оценки результатов освоения профессионального модуля разработан на основе Федерального государственного образовательного стандарта среднего профессионального
images -> По направлению подготовки
images -> Добавить гаджеты. Добавление гаджетов
images -> Техническое задание № apnip/C. 2/CS/Ind/01 Международный консультант по улучшенной производительности орошаемого земледелия
images -> Комплект контрольно-оценочных средств по профессиональному модулю пм. 01 Техническое обслуживание и ремонт автотранспорта


Поделитесь с Вашими друзьями:
1   ...   14   15   16   17   18   19   20   21   22




База данных защищена авторским правом ©vossta.ru 2022
обратиться к администрации

    Главная страница