Réactif Extensions (Rx) + MVVM =?
L'un des exemples utilisés pour expliquer le pouvoir de Réactif Extensions (Rx) est la combinaison d'événements de souris dans un nouvel "événement" représentant les deltas au cours de la souris, faites glisser:
var mouseMoves = from mm in mainCanvas.GetMouseMove()
let location = mm.EventArgs.GetPosition(mainCanvas)
select new { location.X, location.Y};
var mouseDiffs = mouseMoves
.Skip(1)
.Zip(mouseMoves, (l, r) => new {X1 = l.X, Y1 = l.Y, X2 = r.X, Y2 = r.Y});
var mouseDrag = from _ in mainCanvas.GetMouseLeftButtonDown()
from md in mouseDiffs.Until(
mainCanvas.GetMouseLeftButtonUp())
select md;
Source: Matthieu Podwysocki de l'Introduction du Réactif Cadre de la série.
Dans MVVM en général, je efforce de garder mon .xaml.cs fichier aussi vide que possible, et un moyen de capturer des événements à partir de la vue avec des commandes dans le viewmodel purement dans le balisage est à l'aide d'un comportement:
<Button Content="Click Me">
<Behaviors:Events.Commands>
<Behaviors:EventCommandCollection>
<Behaviors:EventCommand CommandName="MouseEnterCommand" EventName="MouseEnter" />
<Behaviors:EventCommand CommandName="MouseLeaveCommand" EventName="MouseLeave" />
<Behaviors:EventCommand CommandName="ClickCommand" EventName="Click" />
</Behaviors:EventCommandCollection>
</Behaviors:Events.Commands>
</Button>
Source: Brian Genisio.
Le Réactif de Cadre semble être plus orienté vers le traditionnel modèle MVC où un contrôleur connaît le point de vue et peut faire référence à son directement des événements.
Mais, j'ai envie d'avoir mon gâteau et le manger!
Comment voulez-vous combiner ces deux modèles?
- Plate-forme? Silverlight?
- Anthony: est-il question?
Vous devez vous connecter pour publier un commentaire.
J'ai écrit un cadre qui représente mes explorations dans cette question appelle ReactiveUI
Il met en œuvre à la fois une Observable ICommand, ainsi que ViewModel objets qui les changements de signal par l'intermédiaire d'un IObservable, ainsi que la capacité à "attribuer" un IObservable à une propriété, qui sera alors le feu INotifyPropertyChange chaque fois que son IObservable changements. Il comprend par ailleurs un lot de modèles communs, comme d'avoir une ICommand qui exécute une Tâche en arrière-plan, puis marshalls les résultats de l'INTERFACE utilisateur.
Je n'ai absolument zéro de la documentation pour l'instant, mais je vais travailler sur l'ajout d'informations dans les prochains jours, ainsi qu'un exemple d'application que j'ai codé en place
Mise à JOUR: j'ai maintenant beaucoup de documentation, découvrez http://www.reactiveui.net
La solution à mon problème s'est avéré être de créer une classe qui implémente à la fois ICommand et IObservable<T>
ICommand est utilisé pour lier l'INTERFACE utilisateur (à l'aide de comportements) et IObservable peuvent ensuite être utilisées dans le modèle de vue de construire composite des flux d'événements.
Où Observables<T> est montré dans La mise en œuvre de IObservable à partir de zéro
Quand j'ai commencé à penser à la façon de "se marier" MVVM et RX, la première chose que j'ai pensé était un ObservableCommand:
Mais ensuite j'ai pensé que le "standard" MVVM façon de liaison de contrôles à ICommand de propriétés n'est pas très RX new'ish, il brise le flux d'événements en assez statique accouplements. RX est plus sur les événements, et en écoutant une Exécuté événement routé semble le plus approprié. Voici ce que j'ai trouvé:
1) Vous avez une CommandRelay comportement qui vous installer à la racine de chaque contrôle de l'utilisateur qui doit répondre à des commandes:
2) ViewModel desservant le contrôle de l'utilisateur est héritée de la ReactiveViewModel:
3) Vous n'avez pas lier des contrôles ICommand propriétés, mais l'utilisation RoutedCommand de la place:
Et en XAML:
En conséquence, sur votre ViewModel vous pouvez écouter les commandes dans un très RX façon:
Maintenant, vous avez le pouvoir de commandes routées (vous êtes libre de choisir de traiter la commande sur l'un ou même plusieurs Viewmodel dans la hiérarchie), de plus, vous avez un "simple flux" pour toutes les commandes qui est nicier de RX que de les séparer IObservable de l'.
Ce doit être parfaitement faisable via le ReactiveFramework, en tant que bien.
La seule modification à apporter serait de créer un comportement pour cela, alors le comportement de crochet jusqu'à la Commande. Il ressemblerait à quelque chose comme:
Viens de réaliser que EventCommand travaille dans une manière très semblable à la façon dont le ReactiveFramework serait, dans ce scénario. Vous n'aurez pas vraiment voir une différence, bien que la mise en œuvre de EventCommand serait simplifiée.
EventCommand déjà est de fournir un modèle push pour vous - lorsque l'événement se produit, il déclenche votre commande. C'est le principal scénario d'utilisation pour le Rx, mais il rend la mise en œuvre simple.
Je pense que l'idée était de créer un événement "corde", dans ce cas, une opération de glisser sans doute, ce qui entraîne une commande appelée? Ce serait faire peu de la même manière que vous feriez dans le code-behind, mais avec le code dans un comportement. Par exemple, créer un DragBehavior qui utilise Rx de combiner le MouseDown/MouseMove/MouseUp événements avec une commande appelée à gérer la nouvelle "événement".