Категории
Войти
Поиск
Реклама
Полезное:
Котлы настенные луганск
HotRoom.com.ua
Как сбросить вес
. диета на овсянке - как сбросить вес, диета для третьей группы крови.
www.gemokod.com.ua
Новые статьи
Опечатка?
Выделите текст и нажмите Shift+Enter.
И мы в ближайшее время ее исправим!
Счетчики
| Добавление функций интерфейса IBindingListView |
|
Если вы помните из главы 7, существует уровень функциональных возможностей привязки данных, определяемый интерфейсом IBindingListView, который вы можете поддерживать, чтобы сделать свои коллекции еще богаче. Более конкретно, интерфейс IBindingListView вводит возможности сортировки более чем по одному свойству и фильтрации по некоторому выражению фильтра, которая позволяет показывать одновременно только часть нижележащей коллекции. Интерфейс IBindingListView определяет четыре дополнительных свойства и два метода, которые вам нужно реализовать для полной поддержки интерфейса. Булевы свойства SupportsAdvancedSorting и SupportsFiltering указывают, какие из двух возможностей вы поддерживаете. Свойство SortDescriptions возвращает коллекцию ListSortDescrip-tionCollection, которая содержит любые критерии сортировки, действительные в настоящий момент. Каждый объект ListSortDescrip-tion в коллекции является просто парой, ассоциирующей Property-Descriptor и ListSortDirection для каждого из свойств, к которым применяется сортировка. Свойство Filter поддерживает установку и получение строки выражения фильтра, которую вы используете для настройки того содержания коллекции, которое представляется любому использующему коллекцию. Класс BindingList<T> уже реализует IRaiseltemChangedEvents, но возвращает false, указывая на отсутствие поддержки. Чтобы показать, что вы добавили поддержку, вам нужно реализовать интерфейс заново и возвратить true в свойстве RaisesItemChangedEvents: Метод ApplySort аналогичен тому, что определен в интерфейсе IBindingList, но принимает параметр ListSortDescriptionCollec-tion вместо одиночных PropertyDescriptor и ListSortDirection. Каждый ListSortDescription в этой коллекции содержит дескриптор свойства и направление сортировки, что позволяет сортировать по каждому критерию по очереди. Метод RemoveFilter удаляет любой действующий в настоящий момент фильтр и восстанавливает коллекцию в ее полном содержании. Хотя это звучит как нечто самоочевидное, реализация этого интерфейса дело нетривиальное. Сортировку по нескольким свойствам реализовать на самом деле довольно просто, но это требует некоторых расширений класса SortComparer<T> и логики сортировки, представленных ранее. Фильтрация может выполняться различными способами, но еще более усложняет положение дел, если вы хотите разрешить добавления и удаления из коллекции, пока она находится в фильтрованном состоянии (по тем же самым причинам, что обусловливают сложности этих операций при сортировке, обсуждавшиеся ранее). Будучи фильтрованной, ваша коллекция в принципе может еще и сортироваться, так что вы должны быть способны вернуться к исходному, возможно, модифицированному списку от сортированного/нефильтрованного, фильтрованного/несортированного и фильтрованного/сортированного состояний. Чтобы показать разумную реализацию, которую вы могли бы утилизировать, если готовы обойтись без добавления и удаления элементов списка, когда он сортирован или фильтрован, я усовершенствовал класс BindingList-View<T>, предусмотрев в нем реализацию IBindingListView. Первым шагом является усовершенствование SortComparer<T> для поддержки сравнений по нескольким свойствам. Полный код класса показан в листинге 9.6. Дополнения к показанному на 9.4 выделены жирным шрифтом. Добавлен новый параметризованный конструктор, позволяющий создать SortComparer<T> для коллекции ListSortDescriptionCollection вместо одиночных PropertyDescriptor и ListSortDirection. В зависимости от использованного конструктора метод Compare вызывает либо непосредственно CompareValues, как в листинге 9.4, либо новый метод RecursiveComparelnternal, который рекурсивно сравнивает два значения, начиная с первого свойства, специфицированного в ListSortDescriptionCollection. Если у двух объектов это свойство равно, метод переходит к следующему свойству, затем к следующему и так до тех пор, пока свойства не будут исчерпаны или не будет найдено различие. Когда все готово, вы можете внести дополнения в класс BindingList-viev<T> для поддержки сортировки по нескольким свойствам. Фильтрация выполняется совершенно отдельно, но также реализуется в этой версии класса. Для простоты код фильтрации поддерживает только фильтрацию по единственному свойству, исходя из строкового представления значения этого свойства, и использует кавычки для ограничения фильтруемого значения. Поддерживаемое выражение фильтра может выглядеть примерно так.
Newer news items:
Older news items:
|
