2015-02-11 3 views
2

Я хочу привязать данные (1000 записей в секунду, я имею в виду 25 записей за 25 milisecond) к списку, и его нужно заказать по убыванию по дате.Wpf Realtime DataBinding To Listview

Я использовал наблюдаемый комплект. Когда я получаю данные из источника (например, socket), я добавляю в свою коллекцию, вставляя модель с нулевым индексом наблюдаемой коллекции.

observableCollection.Insert(0, model); 

Работает без проблем, но использует% 30 cpu (intel i5). И если я открываю эти окна 10 раз, мое приложение становится медленнее. Я использую свойства виртуализации. Если я не устанавливаю источник элементов списка, использование процессора составляет около% 0.

Это мой ListView:

<ListView HorizontalAlignment="Stretch" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" Name="listView" ScrollViewer.CanContentScroll="True" Grid.Column="0" VerticalAlignment="Stretch" ItemsSource="{Binding observableCollection}"> 
    <ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VirtualizingStackPanel></VirtualizingStackPanel> 
    </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    <ListView.View> 

    <GridView> 
     <GridViewColumn DisplayMemberBinding="{Binding ID}" Width="75" Header="Id" /> 
     <GridViewColumn DisplayMemberBinding="{Binding Time}" Width="175" Header="Time" /> 
     <!-- Ten more columns --> 
    </GridView> 
    </ListView.View> 
</ListView> 

Правильно ли использовать ListView?

Как повысить производительность?

Есть ли другие методы для этого?

+2

Игнорирование проблемы с обновлением на мгновение, действительно ли вы ожидаете, что пользователи просмотрят столько данных, которые ищут что-то? Я бы сказал, что даже видимые строки наверху слишком быстро меняются, если кто-то «прочитает», что в них. Может ли альтернативный пользовательский интерфейс быть лучшим подходом? Например, запись данных в какой-то файл журнала и предоставление пользователям диалогового окна поиска. –

+0

Нет, пользователи должны использовать прокрутку –

+0

Это несчастливо. Вероятно, вы уже поняли, что метод привязки «ObservableCollection» и «ItemsControl» не справится с этим объемом обновления данных с такой скоростью. Также вы вставляете элементы вверху списка, а не внизу, что AFAIK заставит элемент управления обновлять * все * своих контейнеров. Если это ваши ограничения пользовательского интерфейса, я бы предложил отказаться от контроля элементов и привязки вообще, написав собственный пользовательский элемент управления и создав визуальные эффекты с помощью кода. –

ответ

0

Событие INotifyCollectionChanged ObservableCollection является узким местом. Сначала попробуйте создать список результатов, затем создайте ObservableCollection из вашего списка, а затем назначьте ObservableCollection в ItemsSource вашего элемента управления.

0

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

Количество данных и количество обновлений слишком велико, и подделка длинного списка может быть единственным решением.