Что такое хороший способ отображения динамических данных в WPF?

Я борюсь с лучшим способом обработки приложения WPF с динамическим обновлением данных. Должен ли я использовать расширенную привязку данных, предоставляемую WPF или нет?

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

Упрощенная проблемная область . Предположим, у вас есть система с около 1000 элементов, каждый из которых имеет уникальное « имя », динамические « скорость » и « местоположение ». Данные для этих элементов обновляются 60 раз в секунду. Вы хотите отобразить эти данные пользователю в различных пользовательских интерфейсах - от «ярлыков с отображением цифр» до графических циферблатов / метров / датчиков / и т. Д. Идеальная работа для WPF - отделите визуальные элементы от остальной части приложения. Как бы вы спроектировали эту систему?

Мое первое решение : Мое первое решение состояло в том, чтобы определить объект со свойствами скорости и местоположения (doubles) под названием « DataItem », определить интерфейс со свойством name (строка). Элементы управления, отображающие данные, должны будут реализовывать интерфейс имен. Был создан «DataManager», который сканировал на наличие FrameworkElements, который реализовывал интерфейс, создавал список пар имя / FrameworkElements во время инициализации. Затем, 60 раз в секунду, список из 1000 DataItems обновлялся, и DataContext каждого соответствующего FrameworkElement устанавливался в объект DataItem. Это работало, производительность была приемлемой (особенно если данные не всегда менялись).

Мое второе решение касалось проблемы, заключающейся в том, что элементы управления пользовательского интерфейса в первом решении должны были реализовывать некоторый интерфейс - юк. Я хочу использовать нестандартные элементы управления WPF (в некоторых случаях). Итак, второе решение состояло в том, чтобы определить «Присоединенное свойство» (я поместил его в объект DataManager), чтобы вы могли - в xaml - делать такие вещи, как

<Label DataManager.Name = "objectname"  Content="{Binding}" />

Почему-то это решение пока не выглядит правильным. Моим третьим решением было изучить реализацию пользовательского DataSourceProvider. Я не был успешным. Я не мог понять модель поставщика источника данных и то, как она будет использоваться в этом случае.

Сейчас я смотрю на проект CodePlex «динамическое отображение данных», опубликованный Microsoft Research. Этот проект предназначен для построения графиков динамических данных, но там могут быть некоторые идеи. Так что здесь я на StackOverflow - обычно это место с короткими вопросами и быстрыми ответами. :-)

Я очень новичок в WPF и буду признателен за любые мысли по этому поводу. Помните, что указанная здесь проблемная область упрощена, поэтому мне нужно надежное решение. На самом деле существует много различных типов объектов данных, каждый из которых имеет свои свойства; и обновления данных не одинаковы для каждого объекта, а элементы управления пользовательского интерфейса отображают отдельные элементы и группы элементов, данные поступают из многих источников и т. д.

13.12.2008 16:16:37
Я забыл упомянуть, что в некоторых случаях привязка для некоторых объектов является двусторонней (пользовательский интерфейс может управлять ими).
Bill 13.12.2008 16:19:36
Боюсь, у меня нет ответа, но это хороший вопрос. Я буду следить за этим. WPF дизайн - это то, с чем я до сих пор борюсь.
Greg D 13.12.2008 16:26:19
1 ОТВЕТ
РЕШЕНИЕ

Ты почти там. Вы хотите, чтобы данные связывались на двух уровнях.

Во-первых - попросите ваш DataItem реализовать INotifyPropertyChangedили DispatchingObjectреализовать свойства зависимостей для каждого из значений, с которыми вы хотите связать

Второе - держите все ваши DataItem в одном из ObservableCollection<DataItem>или DataTable. Вам нужна коллекция, которая поддерживает INotifyCollectionChangedили IBindingList.

В-третьих, используйте какой-либо элемент управления контейнером (список, элемент управления 3-ей пары и т. Д.), Чтобы привязать список DataItem к вашему приложению.

Четвертое. Определите, DataTemplateчтобы каждый из элементов DataItem визуально выглядел

В- пятых - в случае необходимости, использовать DataTemplateSelectorдля динамического выбора DataTemplate для различных видов DataItem s

Вот немного xaml, чтобы вы начали

<ListBox ItemsSource="{Binding ...}" ItemTemplateSelector="{StaticResource DTSelector}">
6
15.12.2008 02:37:49
Скотт, спасибо, что нашли время! Я никогда не слышал о селекторе шаблонов элементов. Я нахожусь на этапе архитектурного исследования / прототипирования, поэтому я немного пойду по предложенному вами пути. Я был обеспокоен тем, что 1000 элементов 60x в секунду вызывают события «свойство изменено» в качестве механизма уведомления. Тестирование покажет
Bill 13.12.2008 18:33:27
Если вы реализуете INotifyPropertyChanged, ВЫ можете контролировать, когда вы уведомляете об изменении свойства.
user1228 13.12.2008 20:01:41
Вам нужно обязательно следить за производительностью. Если вы используете панель виртуализации, WPF не будет перерисовывать элементы, которые не видны.
Scott Weinstein 13.12.2008 23:14:52