Один из основных примеров, используемых для объяснения мощности Reactive Extensions (Rx), объединяет существующие события мыши в новое "событие", представляющее дельта во время перетаскивания мыши:
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;
Источник: Мэтью Подвайски Введение в серию Reactive Framework.
В MVVM я обычно стараюсь, чтобы мой .xaml.cs файл был как можно более пустым, и один из способов подключения событий из представления с командами в модели view чисто в разметке использует поведение:
<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>
Источник: Брайан Генисио.
Reactive Framework, похоже, больше ориентирована на традиционный шаблон MVC, где контроллер знает представление и может напрямую ссылаться на его события.
Но я хочу, чтобы у меня был торт и съел его!
Как бы вы объединили эти два шаблона?