2015-02-11 84 views
2

我想綁定數據(每秒1000條記錄,我的意思是每25毫秒25條記錄)到一個列表視圖,它必須按日期時間降序排列。Wpf實時數據綁定到列表視圖

我已經使用了observable集合。當我從源(例如套接字)獲取數據時,我通過將模型插入可觀察集合的零索引來添加到我的集合中。

observableCollection.Insert(0, model); 

它工作沒問題,但它使用%30 cpu(英特爾i5)。如果我打開這些窗口10次,我的應用程序變得越來越慢。我正在使用虛擬化屬性。 如果我不設置listview的itemsource,cpu使用率大約爲0。

這是我的列表視圖:

<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> 

是否正確使用列表視圖?

我該如何提高性能?

有沒有其他技術可以做到這一點?

+2

暫時忽略刷新問題,你真的希望用戶滾動瀏覽那麼多的數據尋找什麼?我會爭辯說,即使是頂部的可見行也會變得太快,以至於無法「閱讀」其中的內容。可能一個替代用戶界面是一個更好的方法?例如,將數據寫入某種日誌文件併爲用戶提供搜索對話框。 – 2015-02-11 15:45:16

+0

不,用戶應該使用滾動 – 2015-02-11 16:42:57

+0

這很不幸。你可能已經意識到'ObservableCollection'和'ItemsControl'綁定方法將無法應對以這種速度刷新數據量。您也可以將項目插入列表頂部,而不是底部,AFAIK將使項目控件刷新所有*容器。如果這些是你的UI約束,那麼我會建議完全放棄項目控件和綁定,編寫自己的自定義控件並通過代碼隱藏創建視覺效果。 – 2015-02-11 16:51:16

回答

0

ObservableCollection的INotifyCollectionChanged事件是瓶頸。嘗試先建立結果列表,然後從列表創建ObservableCollection,然後將ObservableCollection分配給控件的ItemsSource。

0

考慮一個虛假的滾動條,只需將前100個項目添加到列表框中,但將單獨滾動條的最大值和值設置爲實際數據大小和位置。這需要更多的代碼來保持滾動條和列表框的同步。

數據量和更新次數太多,假裝長列表可能是唯一的解決方案。