Оптимизация производительности: Привязка данных
Windows Presentation Foundation (WPF) Привязка данных обеспечивает простой и последовательный способ представления и взаимодействия с данными приложениях. Можно связывать элементы с данными из различных источников данных в виде объектов CLR и XML.
В этом разделе даются рекомендации по повышению производительности привязки данных.
Как разрешаются ссылки для привязки данных
Прежде чем обсуждать вопросы производительности привязки данных, стоит изучить, как механизм привязки данных Windows Presentation Foundation (WPF) разрешает ссылки на объекты для привязки.
Источником привязки данных Windows Presentation Foundation (WPF) может быть любой объект CLR. Можно выполнять привязку к свойствам, вложенным свойствам или индексаторам объекта CLR. Ссылки привязки разрешаются с помощью либо отражения Microsoft .NET Framework или ICustomTypeDescriptor. Ниже приведены три метода для разрешения ссылок на объекты для привязки.
Первый метод включает использование отражения. В этом случае PropertyInfo объект используется для обнаружения атрибутов свойства и предоставляет доступ к метаданным свойства. При использовании ICustomTypeDescriptor интерфейс, механизм привязки данных использует этот интерфейс для доступа к значениям свойств. ICustomTypeDescriptor Интерфейс особенно полезна в случаях, когда объект имеет статический набор свойств.
Уведомления об изменении свойств могут предоставляться путем реализации INotifyPropertyChanged интерфейс или с помощью уведомлений об изменениях, связанных с TypeDescriptor. Однако рекомендуемой стратегией для реализации уведомления об изменении свойств является использование INotifyPropertyChanged.
Если исходный объект является CLR объект и свойство источника является CLR свойство, Windows Presentation Foundation (WPF) механизм привязки данных должен сначала использовать отражение для исходного объекта, чтобы получить TypeDescriptorи затем запросить PropertyDescriptor. Эта последовательность операций отражения может занимать очень много времени с точки зрения производительности.
Второй метод разрешения ссылок на объекты включает CLR исходный объект, реализующий INotifyPropertyChanged интерфейса и источник свойства, которое является CLR свойство. В этом случае механизм привязки данных использует отражение непосредственно в исходном типе и возвращает необходимое свойство. Это по-прежнему не самый оптимальный метод, но он предъявляет меньше требований к рабочему набору, чем первый метод.
Третий метод для разрешения ссылок на объекты включает исходный объект, который является DependencyObject и исходное свойство, которое является DependencyProperty. В этом случае механизму привязки данных не нужно использовать отражение. Вместо этого механизм свойства и механизм привязки данных оба разрешают ссылку на свойство независимо. Это оптимальный метод для разрешения ссылок на объекты, используемые для привязки данных.
В следующей таблице сравнивается скорость привязки данных Text свойство тысяч TextBlock элементов с помощью этих трех методов.
Привязка свойства Text объекта TextBlock | Время привязки (мс) | Время отрисовки — включает привязку (мс) |
---|---|---|
К свойству объекта CLR | 115 | 314 |
К свойству CLR объекта, который реализует INotifyPropertyChanged | 115 | 305 |
Чтобы DependencyProperty из DependencyObject. | 90 | 263 |
Привязка к большим объектам среды CLR
Привязка данных к одному объекту CLR с тысячами свойств значительно влияет на производительность. Это влияние можно минимизировать путем разделения одного объекта на несколько объектов CLR с меньшим количеством свойств. В таблице показаны время привязки и время отрисовки для привязки данных к одному большому объекту CLR и к нескольким небольшим объектам.
Привязка данных 1000 объектов TextBlock | Время привязки (мс) | Время отрисовки — включает привязку (мс) |
---|---|---|
К объекту CLR с 1000 свойств | 950 | 1200 |
К 1000 объектов CLR с одним свойством | 115 | 314 |
Привязка к ItemsSource
Рассмотрим сценарий, в котором у вас есть CLR List<T> объект, содержащий список сотрудников, которые вы хотите отобразить в ListBox. Чтобы установить соответствие между этими двумя объектами, нужно привязать список сотрудников к ItemsSource свойство ListBox. Предположим, что к группе присоединяется новый сотрудник. Может показаться, что для вставки этого человека в список связанных ListBox значения, вы бы просто добавить этого пользователя в список сотрудников и ожидать, что это изменение автоматически распознается модулем привязки данных. Это предположение оказалось бы false; на самом деле, изменения не будут отражены в ListBox автоматически. Это обусловлено CLR List<T> объекта не вызывает событие изменения коллекции автоматически. Чтобы получить ListBox для учета изменений, вам придется повторно создать список сотрудников и присоединить его к ItemsSource свойство ListBox. Хотя это решение работает, оно серьезно влияет на производительность. Каждый раз при присваивании ItemsSource из ListBox с новым объектом ListBox сначала отбрасывает предыдущие элементы и повторно создает весь список. Влияние на производительность увеличивается в том случае, если ваш ListBox сопоставляется со сложным DataTemplate.
Эффективным решением этой проблемы является преобразование списка сотрудников ObservableCollection<T>. ObservableCollection<T> Объект инициирует уведомление об изменениях, которые механизм привязки данных может получать. Событие добавляет или удаляет элемент из ItemsControl без необходимости восстановления всего списка.
В таблице ниже показано время, уходящее на обновление ListBox (с отключенной виртуализацией пользовательского интерфейса) при добавлении одного элемента. Число в первой строке представляет время, затраченное при CLR List<T> объект привязан к ListBox элемента ItemsSource. Число во второй строке представляет время, затраченное при ObservableCollection<T> привязан к ListBox элемента ItemsSource. Примечание сэкономить значительное время с помощью ObservableCollection<T> стратегии привязки данных.
Привязка данных ItemsSource | Время обновления для 1 элемента (мс) |
---|---|
Чтобы CLR List<T> объекта | 1656 |
Для ObservableCollection<T> | 20 |
Привязка IList к ItemsControl не IEnumerable
Если у вас есть выбор между привязкой IList<T> или IEnumerable для ItemsControl , следует выбрать IList<T> объекта. Привязка IEnumerable для ItemsControl заставляет WPF создание оболочки IList<T> объектом, то есть производительность зависит также от лишняя нагрузка от второго объекта.
Не преобразовывайте объекты среды CLR в XML только для привязки данных.
WPF позволяет привязать данные к XML содержимого; Однако привязка данных к XML содержимого выполняется медленнее, чем привязка данных к CLR объектов. Не преобразуйте данные объекта CLR в XML, если единственной целью этого является привязка данных.
См. также
- Улучшение производительности приложений WPF
- Планирование производительности приложения
- Использование преимуществ оборудования
- Разметка и разработка
- Двумерная графика и изображения
- Поведение объекта
- Ресурсы приложений
- Текста
- Дополнительные рекомендации по повышению производительности
- Общие сведения о привязке данных
- Пошаговое руководство. Кэширование данных приложения WPF