So verschieben Sie ein Update auf eine Bindung in WPF

7

Gibt es eine einfache Möglichkeit, einer Zwei-Wege-WPF-Datenbindung mitzuteilen, dass sie einige Millisekunden nach der letzten Änderung warten soll, bevor sie die Quelle mit dem neuen Eigenschaftswert aktualisiert?

Ich implementiere eine Filterfunktion für eine ListBox, in der ich ein Textfeld habe, und ich möchte den Inhalt der ListBox nach dem, was ich eintippe, filtern. Ich verwende Datenbindung, um die Teile miteinander zu verbinden. Das Filtern der Liste kann ziemlich zeitaufwendig sein, deshalb möchte ich es nicht nach jedem eingegebenen Zeichen machen: daher meine Anfrage.

Ich habe Paul Stovells DelayBinding Extension benutzt (seine Site ist im Moment down, also kann ich nicht mit ihr verlinken). Ich vermute jedoch, dass dies der Grund für einen Speicherverlust in meiner Anwendung ist (verursacht dadurch, dass Event-Handler nicht entfernt werden).

Hat noch jemand andere Ideen?

    
Samuel Jack 29.01.2009, 13:12
quelle

3 Antworten

13

Ich bin auch ein paar Jahre zu spät, aber wenn Sie WPF 4.5+ Es gibt jetzt eine Eigenschaft genau für diesen Zweck, sie heißt Delay .

Beschreibung

  

Die Zeitspanne in Millisekunden, die gewartet werden soll, bevor das Update von   Bindungsquelle.

Beispiel Verwendung

%Vor%     
João Portela 13.03.2013 16:14
quelle
5

Ein wenig spät zur Frage hier (nur ein paar Jahre :) aber für jeden, der interessiert ist, hatte ich eine ähnliche Anforderung in einem Projekt, also habe ich zwei Markup-Erweiterungen namens DelayBindingExtension und DelayMultiBindingExtension erstellt.

Sie funktionieren wie normal Bindings mit dem Zusatz, dass Sie UpdateSourceDelay und / oder UpdateTargetDelay angeben können, die beide TimeSpan -Eigenschaften sind. Außerdem habe ich verifiziert, dass es leckfrei ist (es verwendet den eigentümlichveränderten Rückruf einer Abhängigkeitseigenschaftsbindung durch einen Vererbungskontext anstelle von DependencyPropertyDescriptor ) .

Beispielverwendung für ein DelayBinding

%Vor%

Und für ein DelayMultiBinding

%Vor%

Quellcode und Beispielnutzung für DelayBinding und DelayMultiBinding können heruntergeladen werden hier .
Wenn Sie an den Implementierungsdetails interessiert sind, können Sie meinen Blogpost darüber hier lesen: DelayBinding und DelayMultiBinding mit Quell- und Zielverzögerung

    
Fredrik Hedblad 02.05.2012 23:44
quelle
2

Zuerst, um Ihre Frage zu beantworten, würde ich das UpdateSourceTrigger Bindungserweiterung, mit der Sie steuern können, wann die Bindung aktualisiert wird. Versuchen Sie es zuerst mit LostFocus, aber es klingt so, als würden Sie sich für Explicit entscheiden.

Zweitens, wenn Ihre Filterung lange dauert, würde ich mich mit CollectionViewSource auf Ihrer ListBox beschäftigen. Bea Stollnitz hat eine gute Grundierung darauf hier und ich habe dieser Blogbeitrag , um mir zu zeigen, wie man filtert. Als ich umgestiegen bin, habe ich einen enormen Geschwindigkeitsunterschied zu meiner anderen Implementierung bemerkt, obwohl sie die gleichen Filterfunktionen verwenden. Auch CollectionViewSource wird automatisch mit der Aktualisierung von gefilterten Elementen umgehen, wenn sich die Liste, an die Sie gebunden sind, sogar auf der Elementebene ändert, wenn Sie an eine ObservableCollection binden (dies ist der ursprüngliche Grund für die Änderung von CollectionViewSource).

HTH

    
Bryan Anderson 29.01.2009 15:32
quelle

Tags und Links