2013-07-01 53 views
2

我是RX的新手,我試圖將它適配到我的WinForms應用程序。 (Un?)幸運的是,我使用MVP模式,其中View是從任何特定的實現(例如WinForms)中抽象出來的。WinForms中的RX和Model-View-Presenter

當RX友好型產生新的價值,主持人把它買走,嘗試更新視圖。問題是我無法觀察主線程,因爲我沒有引用WinForms控件。

我發現了一些解決方案,但都沒有看上去有對我說:

  1. 在視圖中創建一個控件屬性,這樣我可以在上面看到。
  2. 使用Control.Invoke內部屬性setter它們通過演示
  3. 修改創建一個類似的擴展方法:

public static IObservable<T> ObserveOn<T>(this IObservable<T> observable, IMyView view) 
{ 
    var control = (Control)view; 
    return observable.ObserveOn(control); 
} 

是否有處理這個的好方法?

編輯:我發現了另一個解決方案,我最喜歡的:

​​

回答

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))。

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

其中NuGet包中包含的擴展方法:

然後,你可以爲實現您的ObserveOn(observable, view)擴展方法?我找不到它。 – dzendras

+0

我不是100%確定。我認爲'Rx-WPF',儘管我認爲你只需要引用'System.Reactive.Windows.Threading.dll'。 – Brandon

+0

「view.Scheduler」解決方案看起來不錯。不過,我找到了另一種方法(請參閱編輯)。你怎麼看呢? – dzendras