我如何绑定到一个“聚焦”的条目?event with Reactive

本文关键字:Reactive with event 聚焦 一个 何绑定 绑定 | 更新日期: 2023-09-27 18:06:48

我试图绑定到一个文本输入字段"聚焦"事件使用响应,但我的代码是失败的编译。

下面是我现在正在做的,它工作得很好:

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事件使用反应?

我如何绑定到一个“聚焦”的条目?event with Reactive

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

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 }

我对react也很陌生,但这(应该)会让你朝着正确的方向前进。

干杯,快乐编码!

所以,在使用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扩展名,你可以在这里截取。