我对反应性UI很新。我在我的应用程序中广泛使用它来进行异步编程等。
我有一个问题。我的ViewModel中有一个异步方法,可以“等待”任务完成。完成此任务后,我想通知我的视图(UserControl),以便它可以动态添加更多内容/ UserControls,比如DockPanel。
使用ReactiveUI或RX执行此操作的最佳方法是什么?我可以使用C#事件机制等,但我想继续沿RX路径前进。当异步方法“完成”(即从等待返回)时,我在我的VM中设置了boolena属性。
然后我想在我的“视图”中观察这个布尔属性(在我的VM中定义)..所以我可以在我的“视图”中附加一个处理程序,它将动态创建一些UserControls,例如
this.viewModel.ObservableForProperty(x => x.DataLoaded)
.Subscribe(async _ => await this.MyViewHandler());
// this does not compile as the delegate is not IObserver type in my view it says
非常感谢任何指导,非常感谢。
答案 0 :(得分:2)
你大多都有正确的想法,只需要对语法做一些工作:
this.WhenAnyValue(x => x.ViewModel.DataLoaded)
.Where(x => x == true)
.Subscribe(_ => MyViewHandler());
答案 1 :(得分:0)
示例代码的问题在于,正如编译器所说,您没有将有效的IObserver
实现传递给Subscribe
方法。您实际上正在通过Func<boolean, Task>
,期望Action<boolean>
实现IObserver.OnNext。
我没有尝试使用ReactiveUI,但我认为您可以完成,但您打算使用Task Continuation或使用IObserver.OnCompleted。一些想法是:
使用“任务继续”,一旦您提到的任务完成,您就会启动另一项任务。您可以通过为您的任务附加.ContinueWith
来执行此操作。请记住,必须从继续任务(使用Dispatcher
或将正确的TaskScheduler
传递给ContinueWith
)将修改UI的继续任务中的代码分派到UI线程。
使用RX,您可以使用正确的Observable.Create
工厂方法或仅使用Task.ToObservable
扩展方法为您的任务创建序列,然后订阅它并在OnCompleted
处理程序。