gpt4 book ai didi

c# - WinForms 中的 RX 和 Model-View-Presenter

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:08 24 4
gpt4 key购买 nike

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

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

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

  1. 在 View 中创建一个 Control 属性,以便我可以观察它。
  2. 在 Presenter 修改的属性 setter 中使用 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
}

最佳答案

presenter 在订阅模型时是否在 UI 线程上运行?只需使用 ObserveOnDispatcher在您订阅 Observable 时:

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

编辑:

或者,您可以获得 Rx-Windows Forms Helper 并让您的 IMyView 接口(interface)公开一个 IScheduler(它通过调用 新的 ControlScheduler(control)).

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

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

关于c# - WinForms 中的 RX 和 Model-View-Presenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17409760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com