如何使用Reactive绑定Entry的“聚焦”事件?

时间:2016-09-14 00:09:28

标签: c# xamarin.forms reactive

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

这就是我现在正在做的事情,它运作良好:

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>>

问题

如何使用被动方式绑定到条目Focused事件?

2 个答案:

答案 0 :(得分:1)

所以为了从一个事件中得到一个基本的observable,我通常会这样构造:

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来说还是比较新的但是这个(应该?)让你朝着正确的方向前进。

干杯,快乐的编码!

答案 1 :(得分: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扩展名,可以抓住here