2017-05-16 2 views
-1

Ich habe nie zuvor mit den ReactiveExtensions gearbeitet. Ich schaute online und konnte nicht wirklich einen Weg finden, der meinen Bedürfnissen entsprach. Alle Beispiele scheinen etwas übertrieben, verglichen mit dem, was ich erreichen muss.Reaktive Erweiterung auf Methode aufgerufen von Eigenschaft

Ich habe eine Methode, die alles für mich tut, also muss ich nicht die Werte zurückgeben und dann meine Liste einstellen. Alles, was ich will, ist, die Methode auszuführen, wenn der Benutzer schließlich aufhört zu tippen und nicht während der Benutzer tippt. Wie erreiche ich das mit reaktiven Erweiterungen?

Zur Zeit habe ich folgendes:

private string _searchText; 
public String SearchText 
{ 
    get { return _searchText; } 
    set 
    { 
    _searchText = value; 
    MyMethod(); 
    } 
} 

<textbox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}"/> 

Antwort

0

Ihre Eigenschaften shold nicht anders, als den Wert auf dem Trägerfeld festgelegt und Änderungsbenachrichtigungen erhöhen.JEDE andere Logik sollte außerhalb von gestellt werden und diese Änderungsbenachrichtigungen über ein Observable abhören.

In Ihrem Fall möchten Sie die Benachrichtigungen erst nach Ablauf einer bestimmten Zeit abhören, so dass Sie mit dem Operator IObservable.Throttle ein bestimmtes Zeitintervall warten können, bevor Sie die Benachrichtigung weiterleiten.

So kann dies eine einfache Implementierung von INotifyPropertyChanged sein:

public event PropertyChangedEventHandler PropertyChanged; 

public void NotifyPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

Dies ist, wie Sie jede Eigenschaft schreiben sollen:

// Just check if value is different from the actual backing field. 
// If and only if it is, set the backing field and raise the PropertyChanged event. 
public string SearchText 
{ 
    get { return _SearchText; } 
    set 
    { 
     if (!EqualityComparer<string>.Default.Equals(_SearchText, value)) 
     { 
      _SearchText = value; 
      NotifyPropertyChanged(); 
     } 
    } 
} 
private string _SearchText; 

erste Lösung: Gas im Ansichtsmodell:

// Transform the PropertyChanged event in an Observable 
var changed = Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
    h => PropertyChanged += h, 
    h => PropertyChanged -= h); 

// Transform the Observable to your need, 
// filtering only when SearchText changes 
changed.Where(x => x.EventArgs.PropertyName == nameof(SearchText)) 
// Wait 500 ms before forwarding the notification; 
// if another char in inserted from the user beside this interval, 
// the previous value is ignored 
.Throttle(TimeSpan.FromMilliseconds(500)) 
// Necessary to avoid cross-thread Exceptions 
.ObserveOn(Scheduler.CurrentThread) 
// finally, subscribe your method: 
.Subscribe(_ => MyMethod()); 

Sie können th e obiger Code, wo immer ist angebracht: in dem Konstruktor des Ansichtsmodelles, in einer Init() Methode ...

zweite Lösung: Verwenden Sie die Delay-Eigenschaft des Bindings

Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged, Delay=500}" 

Es hat das gleiche Ergebnis.

Verwandte Themen