Datengebundene Steuerelemente sollten nicht aktualisiert werden, wenn sie nicht sichtbar sind

8

Ich habe eine WPF-Anwendung und das Design folgt dem Standard-MVVM-Modell.

Wenn die zugrunde liegenden Datenänderungen, meine Ansicht nach Modell der Property Ereignis, damit die Steuerelemente aktualisiert werden können.

Meine Hauptansicht ist ein Tab-Steuerelement, daher sind die meisten Steuerelemente zu einem bestimmten Zeitpunkt nicht sichtbar. Es gibt Leistungsprobleme, und ich habe festgestellt, dass ein Großteil der CPU-Zeit für das Abrufen von Daten zum Aktualisieren unsichtbarer Steuerelemente verwendet wird. (Mein Ansichtsmodell verwendet eine verzögerte Bewertung, daher werden die PropertyChanged-Ereignisse ausgelöst, aber die endgültigen anzeigbaren Eigenschaften werden erst berechnet, wenn Sie dazu aufgefordert werden.)

Hat WPF eine Standardmethode, um mit diesem Problem umzugehen?

Idealerweise sollte, wenn ein unsichtbares Steuerelement ein relevantes PropertyChanged-Ereignis empfängt, es einfach denken: "Ich muss diese Eigenschaft erneut anfordern, sobald ich wieder sichtbar bin .

    
Andrew Shepherd 04.05.2011, 23:10
quelle

3 Antworten

1

Ich glaube nicht, dass es eine Infrastruktur gibt, die es ermöglicht, Bindings zu deaktivieren, die nicht sichtbaren Steuerelementen zugeordnet sind. Leider gibt es viele Situationen, in denen Sie möchten, dass ein Steuerelement, das nicht sichtbar ist, an der Datenbindung beteiligt ist. Am wichtigsten ist, dass Sie oft ein Steuerelement haben, dessen Sichtbarkeit selbst von einer Bindung abhängt. Möglicherweise haben Sie auch eine Bindung zwischen den Eigenschaften eines sichtbaren Steuerelements und eines nicht sichtbaren Steuerelements. Oder jemand könnte das genaue Gegenteil von dem haben, was Sie wollen: das Steuerelement, das sich selbst auffüllt, während es nicht sichtbar ist, und dann, wenn es einmal sichtbar ist, vollständig ausgespielt herausspringt.

Ich denke, die einzige gute Lösung für Ihre Situation ist es, schwergewichtige, nicht sichtbare Kontrollen zu vermeiden, wenn das möglich ist. Speziell für Ihre Tab-Kontrolle hätte ich gedacht, dass dies das Standardverhalten wäre, aber vielleicht hängt es von Ihrer Situation ab. Ironischerweise beschweren sich einige Leute, dass TabControl ihre Kinder beim Wechseln zwischen den Tabs zerstört und wissen möchte, wie das verhindert werden kann, da es einige Arbeit kostet, alle Tabs im Hintergrund zu behalten. Aber Sie scheinen das umgekehrte Problem zu haben.

Hier ist die Quelle, die ich für TabControl children erwähnt habe:

Sie können möglicherweise in einem kleinen Projekt einige Experimente durchführen, um das Recyclingverhalten, das sie ausschalten möchten, zu aktivieren. Wenn Ihr Steuerelement bei Bedarf geladen wurde, ist die Tab-Umschaltung möglicherweise etwas langsamer, aber die Leistung auf einer Registerkarte würde sich verbessern.

    
Rick Sladkey 04.05.2011 23:51
quelle
1

Wir haben etwas in dieser Richtung in unserem Basis-ViewModel gemacht.

Hinweis: Sie müssen entsprechend der Sichtbarkeit der Ansicht einfrieren / auftauen.

Im Prinzip werden alle PropertyChanged-Ereignisse im eingefrorenen Zustand abgefangen und beim Auftauen ausgegeben. Während Du auch keine Betrüger hältst, da sie in unserem Fall keine Rolle spielen.

%Vor%     
Peter Drier 12.10.2011 21:03
quelle
0

Mein Basisansichtsmodell hat eine IsVisible-Eigenschaft. Wenn das Ansichtsmodell unsichtbar ist, unterdrücken Sie nur die Benachrichtigungen über geänderte Eigenschaften. Wenn es sichtbar wird, feuern Sie eine Eigenschaft für jede Eigenschaft ab (pr pass in null auf den Namen der Eigenschaft)

    
cordialgerm 12.10.2011 21:37
quelle

Tags und Links