Aktualizace ListView ve WPF   zodpovězená otázka

VB.NET, WPF

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
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Určitě tento způsob nepoužívat, už kvůli tomu, že vymýšlíte již vymyšlené a určitě se Vám to nepovede lépe :)) Použijte standardní přístup přes rozhraní INotifyPropertyChanged.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem to předělal a měl jste pravdu. Když hodnoty předávám přes iNotifyPropertyChange tak je to úplně jiná káva. Rychlost je pod 1ms, prostě paráda.

Ještě dlouhá cesta pro plné pochopení WPF.

Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback