我开始尝试ReactiveUI,但我仍然坚持如何实现简单的拖放操作。我正在围绕项目控件拖动矩形,该控件具有一个用于面板的网格。我已经完成了基本的拖放操作,但是我想防止 如果网格单元已被占用,则单击,然后在将鼠标拖动到已占用的单元上时更改鼠标光标。我有一个的字典,我使用消息总线检索内容为null或MyObject,然后将另一条消息与结果一起发回。
MessageBus.Current.Listen<Point>().Subscribe(gp =>
{
MessageBus.Current.SendMessage(SegmentMap.ContainsKey(gp) ? SegmentMap[gp] : null);
});
现在我有了结果,我不知道如何使用它来修改我的拖放式Observable方法链,即代替
mouseMove.TakeUntil(mouseLeftUp)
类似
mouseMove.TakeUntil(mouseLeftUp && IsCellClear == true)
我正在使用WPF和MVVM。这是我的主要观察对象:
var dropGridPosition = mouseLeftDown.SelectMany(start => mouseMove.TakeUntil(mouseLeftUp),
(start, end) => new DropGridPosition(new Point {X = end.X - start.X,
Y = end.Y -start.Y}, start))
.Where(p => !p.DropOffset.Equals(_offsetZero))
.DistinctUntilChanged();
答案 0 :(得分:1)
检查以确保您不能使用Bind而不是MessageBus(或在需要时绕过Observable)。在大多数情况下,RxUI(ReactiveUI)中,MessageBus通常是一个糟糕的抽象。
使用TakeUntil,您可能希望将MouseUp事件和WhenAnyValue()都合并到AllCell属性中。
类似这样的东西:
var isCellNotClear = this.WhenAnyValue(x => x.CellValue).Select(x => x != null);
// CombineLatest will take the multiple observables,
// and with a lambda convert them into Observable with the result from the lambda.
var isCellNotClearOrLeftButtonUp = isCellNotClear.CombineLatest(mouseLeftButtonUp,
(isCell, isMouseUp) => isCell || isMouseUp);
mouseMove.TakeUntil(isCellNotClearOrLeftButtonUp);