WinForms中的RX和Model-View-Presenter

时间:2013-07-01 16:56:01

标签: c# winforms system.reactive mvp scheduler

我是RX的新手,我正在尝试将其改编为我的WinForms应用程序。 (Un?)幸运的是我使用MVP模式,其中View是从任何特定实现(例如WinForms)中抽象出来的。

当RX友好型号产生新值时,演示者获取它并尝试更新视图。问题是我无法在主线程上观察到,因为我没有引用WinForms Control。

我找到了一些解决方案,但它们都不适合我:

  1. 在视图中创建一个Control属性,以便我可以观察它。
  2. 在Presenter修改的属性设置器中使用Control.Invoke
  3. 创建类似于以下内容的扩展方法:
  4. public static IObservable<T> ObserveOn<T>(this IObservable<T> observable, IMyView view)
    {
        var control = (Control)view;
        return observable.ObserveOn(control);
    }
    

    有没有一种很好的方法可以解决这个问题?

    编辑:我找到了另一种我最喜欢的解决方案:

    private readonly SynchronizationContext _syncContext;
    
    public Presenter()
    {
        _syncContext = SynchronizationContext.Current; //I can observe on this one with a reasonable assumption that presenter is created on the UI thread
    }
    

1 个答案:

答案 0 :(得分:1)

演示者在订阅模型时是否在UI线程上运行?只需在您的礼物订阅观察时使用ObserveOnDispatcher

// from your presenter code, which is running on the UI thread:
model.ObservableProperty.ObserveOnDispatcher().Subscribe(p => updateView(p));

编辑:

或者,您可以获取Rx-Windows Forms Helper并让IMyView界面公开IScheduler(通过调用new ControlScheduler(control)创建)。

然后,您可以将ObserveOn(observable, view)扩展方法实现为:

public static IObservable<T> ObserveOn<T>(this IObservable<T> observable, IMyView view)
{
    return observable.ObserveOn(view.Scheduler);
}