使用ReactiveUI.NET在视图和视图模型之间进行通信

时间:2013-12-19 12:26:09

标签: c# mvvm system.reactive reactiveui

我对反应性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

非常感谢任何指导,非常感谢。

2 个答案:

答案 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处理程序。

相关问题