【问题标题】:MVVM + Reactive + WCF callbackMVVM + 反应式 + WCF 回调
【发布时间】:2015-03-04 15:41:12
【问题描述】:

我正在针对具有回调的 TCP.NET WCF 服务使用 MVVM + Reactive Extensions。所以我创建了一个接收回调的 ClientProxy 类。我有一个有主题的 ClientProxy,我在模型中订阅它。现在我想做的是将收到的项目推送到 ViewModel 而无需引用 ViewModel。注意(我已经更改了实际的项目名称,所以如果我拼错了,那不是我的代码的样子)。

型号:

public Subject<CustomSale> CustomSaleAdded = new Subject<CustomSale>();

ClientProxy._onCustomSaleAdded.Subscribe(x =>
{
    CustomSaleAdded.OnNext(x);
});

然后在我的ViewModel,我只是想SubscribeModel Subject CustomSaleAdded 并添加到我的ObservableCollection&lt;Sale&gt; Sales

_scheduleModel.CustomSaleAdded.Subscribe(x =>
{
    Sales.Add(x);
});

发生的事情是该项目从ClientProxyModel,我看到它触发CustomSaleAdded.OnNext(x)。但是在ViewModel,我设置了一个断点,什么也没发生。

那么有人可以告诉我在ViewModel推送一个项目到ObservableCollection 的最佳方法是什么,而ViewModel 不必引用@ 987654336@ 使用响应式扩展?

另外,这是响应式 UI 处理的吗?

我看到的大多数示例都显示 ViewModel 直接使用 Web 服务。我在模型中有两个附加层,然后是 ClientProxy,它们首先获取项目并推送它。

【问题讨论】:

    标签: c# wpf wcf mvvm system.reactive


    【解决方案1】:

    似乎Subject&lt;T&gt; 类不应用于实现CustomSaleAdded 成员,因为Subject&lt;T&gt; 具有以下行为(Subject Class, Remarks section):

    然后通过其 IObservable 接口将数据发布给所有订阅的观察者。

    根本原因:ViewModel 类可能会“错过”可观察序列的某些元素,以防ViewModel 订阅某些元素通过序列。

    请考虑使用ISubject&lt;T&gt; 接口的另一个实现:

    • ReplaySubject Class:

      ReplaySubject 缓冲它收到的项目。因此,稍后创建的订阅可以访问缓冲序列中的项目,即使它们已经发布。 ReplaySubject 将缓冲多少项取决于传递给构造函数的参数。

    • BehaviorSubject Class:

      BehaviorSubject 缓冲它通过其 IObservable 接口发布的最后一项。如果尚未通过其 IObservable 接口发布任何项目,则构造函数中提供的初始项目是当前缓冲的项目。当订阅 BehaviorSubject 的 IObservable 接口时,发布的序列从当前缓冲的项目开始

      一旦 IObserver 接口收到完成,就不会从 BehaviorSubject 缓冲或发布任何项目。

    其他参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2021-10-30
      相关资源
      最近更新 更多