我正在尝试使用被动方式绑定到文本输入字段“聚焦”事件,但我的代码无法编译。
这就是我现在正在做的事情,它运作良好:
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
事件?
答案 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。