簡體   English   中英

WinForms中的RX和Model-View-Presenter

[英]RX and Model-View-Presenter in WinForms

我是RX的新手,我正在嘗試使其適應我的WinForms應用程序。 (Un?)幸運的是,我使用MVP模式,其中View是從任何特定實現(例如WinForms)中抽象出來的。

當RX友好模型產生新值時,演示者獲取它並嘗試更新視圖。 問題是,由於我沒有引用WinForms控件,因此無法在主線程上進行觀察。

我找到了一些解決方案,但對我來說都不滿意:

  1. 在視圖中創建一個Control屬性,以便可以對其進行觀察。
  2. 使用由演示者修改的內部屬性設置器中的Control.Invoke
  3. 創建類似於以下內容的擴展方法:

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
}

演示者在訂閱模型時是否在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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM