Všechny zdravím, pracuji na jednoduché WPF aplikaci, která v rychlém sledu "čte" nějakou periférii (např. joystick v intervalech cca 250ms) a informace prezentuje uživateli. Informace jsou ve formě Klíč - Hodnota. Jako základní prezentační prvek jsem zvolil ListView/GridView o dvou sloupcích. Podobné seznamy jsou v okně tři (jeden obsahuje cca 25 položek a další dva cca 6 položek). Každým průchodem musím aktualizovat všechny tři seznamy - v seznamech se mění pouze Hodnoty, klíče se již nemění.
<ListView x:Name="list1" HorizontalAlignment="Left" Height="264" Margin="25,26,0,0" VerticalAlignment="Top" Width="316">
<ListView.View>
<GridView>
<GridViewColumn Header="col1" Width="100" DisplayMemberBinding="{Binding Path=Key,Mode=OneTime}"/>
<GridViewColumn Header="col2" Width="100" DisplayMemberBinding="{Binding Path=Value,Mode=OneTime}"/>
</GridView>
</ListView.View>
</ListView>
Vše funguje, ale stále se mi nezdá výkon a proto hledám cestu, jak optimálně aktualizovat všechny tři seznamy (myšleno co nejrychleji). Prozatím jsem zkoušel tyto varianty: - V první verzi jsem misto ListView použil PropertyGrid od WPF Toolkit - to byl výkon asi nejhorši. Aktualizace trvala cca 100-150ms a procesor makal jako šílenej. - Proto jsem radeji zvolil ListView a nejprve jsem zkoušel použit jednosměrné "bindování" Dictionary přes ItemsSource. Tady byl výkon o něco lepší, ale porad to trvalo docela dlouho - lehce pod 100ms. - V třetím pokusu jsem vytvořil vlastní třídu pro uložení dvojic Klic-Hodnota a to použivám pro naplnení všech ListView prvku (OneTime) a posléze již pouze edituji hodnoty následujícím kodem (StateProperty je moje třída, kterou vkládám do ListView):
DirectCast(Me.list1.Items(0), StateProperty).Value = 111
...
Me.list1.Items.Refresh()
Tady je výkon asi nejlepší, cca 10-20 ms a procesor je vytížen asi na cca 5%. Ale stále se mi to nezdá a proto bych se rád zeptal zkušenějších, jestli není nějaká další - lepší cesta. Např. akci Items.Refresh() volám pro každý ListView zvlášt - není způsob jak říci celému oknu, aby zaktualizovalo všechny tři najednou? Nebo není cesta jak naplnovat ListView ještě nejakým přímějším způsobem než přístupem přes Items(x)? Myslíte, že výkon bude třeba lepší kdybych zvolil jednosměrné bindování a u mé třídy bych implemetoval rozhraní INotifyPropertyChanged a nechal aktualizaci úplně na WPF bez volání Refresh()? Nebo nějaká úplně jiná cesta? Moc děkuji za nakopnutí. Petr Pro úplnost uvádím třídu pro uložení prvků do ListView:
Class StateProperty
Property Key As String
Property Value As Integer
Public Sub New(Key As String, Value As Integer)
_Key = Key
_Value = Value
End Sub
End Class
|