0

我正在尝试使用响应式绑定到文本输入字段“聚焦”事件,但我的代码无法编译。

这是我现在正在做的事情,效果很好:

Entry _qty; // at class level
_qty.Focused += (s, e) => { /* do stuff */ };

试图

但我想做这样的事情:

// class level

IObservable<string> _qtyFocusObservable;
Entry _qty;


// in a setup function

_qtyFocusObservable =
    Observable 
        .FromEventPattern<EventHandler<FocusEventArgs>>(
            x => _qty.Focused += x,
            x => _qty.Focused -= x
        );

问题

我已经尝试了上面代码的很多变体,我得到编译器错误,说编译器不能从我指定的任何类型隐式转换为System.EventHandler<System.EventHandler<Xamarin.Forms.FocusEventArgs>>,即使我指定的类型确实是System.EventHandler<System.EventHandler<Xamarin.Forms.FocusEventArgs>>

问题

如何使用响应式绑定到我的Entry事件?Focused

4

2 回答 2

1

因此,为了从一个事件中获得一个基本的可观察工作,我通常这样构建:

var focusObservable = Observable.FromEventPattern<EventHandler, FocusEventArgs>( x => _qty.Focused += x.Invoke, x => _qty.Focused -= x.Invoke);

然后,当我需要从该可观察事件中执行某些操作时,我将命令链接到它,如下所示:

var doStuffCommand = ReactiveCommand.CreateAsyncTask(DoStuffAsync); focusObservable.InvokeCommand(doStuffCommand);

使用类似这样的 DoStuffAsync 实现:

public async Task DoStuffAsync(object value, CancellationToken token = default(CancellationToken)) { // Do stuff here }

我对 Reactive 还是很陌生,但这(应该?)让你朝着正确的方向前进。

干杯,快乐的编码!

于 2016-09-14T21:14:22.343 回答
0

因此,在使用 ReactiveUI 一年之后,这就是我在聚焦输入时触发事件的方式。

var focusedObservable =
    Observable
        .FromEventPattern<FocusEventArgs>(
            x => _totalBirds.Focused += x,
            x => _totalBirds.Focused -= x)
        .Select(x => x.EventArgs.IsFocused);

    // fires when focused
    focusedObservable 
        .WhenIsTrue() // extension method, basically .Where(x => x == true)
        .ObserveOn(RxApp.MainThreadScheduler)
        .InvokeCommand(this, x => DoSomething)
        .DisposeWith(ControlBindings); // extension that uses composite disposable

    // fires when changing state back to unfocused
    focusedObservable
        .WhenIsFalse() // extension method, basically .Where(x => x == false)
        .ObserveOn(RxApp.MainThreadScheduler)
        .InvokeCommand(this, x => x.ViewModel.DoSomethingElse)
        .DisposeWith(ControlBindings); // extension that uses composite disposable

这很简单,如果您需要查看任何其他代码,请告诉我。此外,如果您想.DisposeWith获取扩展程序,您可以在此处获取它。

于 2017-09-09T20:19:35.817 回答