Что такое хороший способ для отображения динамических данных в WPF? - PullRequest
7 голосов
/ 13 декабря 2008

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

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

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

Мое первое решение : Моим первым решением было определить объект со свойствами скорости и местоположения (удваивается) под названием « 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 и буду признателен за любые мысли по этому поводу. Помните, что указанная здесь проблемная область упрощена, поэтому мне нужно надежное решение. На самом деле существует много разных типов объектов данных, каждый из которых имеет свои свойства; и обновления данных не одинаковы для каждого объекта, а элементы управления пользовательского интерфейса отображают отдельные элементы и группы элементов, данные поступают из многих источников и т. д.

1 Ответ

6 голосов
/ 13 декабря 2008

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

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

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

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

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

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

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

<ListBox ItemsSource="{Binding ...}" ItemTemplateSelector="{StaticResource DTSelector}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...