【问题标题】:RX and Model-View-Presenter in WinFormsWinForms 中的 RX 和 Model-View-Presenter
【发布时间】:2013-07-01 16:56:00
【问题描述】:

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

当 RX-friendly 模型产生新值时,presenter 获取它并尝试更新视图。问题是我无法在主线程上观察,因为我没有引用 WinForms 控件。

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

  1. 在视图中创建一个 Control 属性,以便我可以对其进行观察。
  2. 在由 Presenter 修改的属性设置器中使用 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
}

【问题讨论】:

    标签: c# winforms system.reactive mvp scheduler


    【解决方案1】:

    presenter 在订阅模型时是否在 UI 线程上运行?只需在您的礼物订阅 observable 时使用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);
    }
    

    【讨论】:

    • 哪个 NuGet 包包含扩展方法?我找不到它。
    • 我不是 100% 确定。我认为Rx-WPF,尽管我认为您只需要引用System.Reactive.Windows.Threading.dll
    • "view.Scheduler" 解决方案似乎不错。但是我找到了另一种方法(见编辑)。你怎么看?
    • 是的,这是另一种方式:)
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多