放置放置位置时防止拖放

时间:2018-07-07 02:00:09

标签: reactiveui

我开始尝试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();

1 个答案:

答案 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);