2010-06-21 15 views
1

Je suis encore un peu nouveau à Rx et j'ai du mal à comprendre comment exprimer cet abonnement (apparemment) simple. Je cherche quelque chose comme ceci:Comment combiner des événements intermédiaires dans un flux Reactive Framework?

  1. Début: InTransaction.Where (inTransaction => inTransaction)
  2. Si: itemChanged ou sur FlagChanged, laissez Changé = true
  3. Fin: InTransaction.Where (inTransaction =>! inTransaction)

Tous ces éléments sont observables. Donc, dès le début d'une transaction, je veux commencer à prêter attention aux notifications de changement, et peu importe le nombre d'entre elles, je veux juste me rappeler que tout a été reçu. Lorsque la transaction se termine, je veux appeler mon gestionnaire pour mettre à jour l'état visuel.

Il y a beaucoup d'exemples amusants en ligne montrant comment faire cela pour les dragages de souris. Le seul problème que j'ai est que je ne veux pas avoir tous les événements modifiés. Je veux juste savoir si certains ont été touchés avant la fin de la transaction.

Quelqu'un peut-il m'aider à me diriger sur la bonne voie?

Mise à jour: mon algorithme actuel ressemble à ceci:

bool pendingRefresh = false; 

Observable 
    .Merge(
     _selectionChanged, 
     _objectManager 
      .PropertiesChanged 
      .Where(objects => objects.Contains(_selectedObject))) 
    .Subscribe(_ => pendingRefresh = true); 

_actionManager 
    .IsInTransaction.Where(isIn => !isIn) 
    .Throttle(TimeSpan.FromSeconds(0.15)) 
    .Subscribe(_ => 
     { 
      if (pendingRefresh) 
      { 
       pendingRefresh = false; 
       Refresh(); 
      } 
     }); 

fonctionne très bien, mais je me demandais si je pouvais sortir avec un seul abonnement.

Répondre

3

On dirait que vous êtes sur la bonne voie. Si vous ne se soucient pas de la façon dont le nombre de notifications de changement viennent, regardez le Tout opérateur:

public static IObservable<bool> Any<TSource>(this IObservable<TSource> source) 

ce sera le feu une seule fois, au moment où le premier message est jamais il le feu vrai, si OnCompleted arrive sans qu'aucun message n'arrive, il tirera faux.

Espérons que cela aide.

Jeffrey