我如何绑定到一个“聚焦”的条目?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
事件使用反应?
因此,为了从事件中获得一个基本的可观察对象,我通常这样构造:
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
扩展名,你可以在这里截取。