我应该使用 Observable 还是 BindingList 来公开要放入 UI 中的更改数据

Should I use an Observable or a BindingList for exposing changing data that I want to put into a UI

我试图让自己在 ViewModel 优先方法中使用 Rx (Xamarin Forms)。我有点不确定的是公开我的数据模型需要提供给视图模型的变化信息的最佳方式。

我有一项服务可以为我的客户提供数据快照,然后通过信号器提供更新的事件,指示添加、更新和删除。我已经为我的客户端数据模型编写了一个应用程序包装器,它可以登录、管理状态和一般连接,并且有一个本地数据库(在我的例子中是 SqlLite)。

我想要的是通过更改事件公开我的应用程序包装器上的数据,以便我可以绑定到事件并创建一个可观察的集合,然后我可以在 WPF/Xamarin.

我可以将 Rx 用于这种或更传统的方法,例如 BindingList。我发现很难决定我应该做什么。我的用例是这样的:

  1. 我想在登录后获得所有本地项目的完整列表
  2. 我想收到更改通知(添加、更新和删除)并做出反应
  3. 我想将上面的转换成合适的视图模型和一个可观察的集合。

我希望能够订阅给定的集合并获取我当前本地的所有条目,但也希望能够通过 SignalR 监视可能发生的更改。这应该是 Rx 吗?或者我应该将 Rx 隐藏在 BindingList 后面(例如)。

也是这样:

IObservable<MyOrder> Orders { get; } // What kind of subject?

或者

BindingList<MyOrder> Orders { get; }

还是别的?

如果是 Rx,我应该怎么做才能确保每个订阅者都能获得当前的订单列表,然后进行更改?

在 ViewModel 上,您希望将数据公开为状态。因此,实现 INotifyPropertyChanged 或公开自己公开 INPC (INotifyPropertyChanged) 的只读属性的 ViewModel 是好的。在这种情况下,VM (ViewModel) 将有一个 Orders 属性

BindingList<MyOrder> Orders { get; }

然后我认为 VM 会订阅一个 Observable Sequence of change 通知。这听起来像是您的 SignalR 频道已经为您提供了。在以前的项目中,我们将 Add/Insert 和更新合并为一个 "upsert" 消息,然后还有 Remove/Delete 和 Clear/Reset 消息。

尝试在本地管理状态时遇到的困难是 "State of the World" 问题。如果您尝试先获取当前快照,然后订阅实时值,则在读取快照时可能会错过一个值。但是,如果您先订阅然后获取快照,您可能会收到两次值。在这种情况下,您还必须处理实时数据的排队问题,直到您处理完快照。

考虑到这一点,您可以尝试将所有内容移动到单线程和可预测的序列模型中,或者只是获得其他可以为您执行此操作的东西(Akavache?)。如果您确实认为值得自己做,那么可能值得尝试使用 checkpoints/sequenceIds 的模型,这样客户端就可以从已知点重新订阅。这将允许该服务只为他们提供最近的更改,或者如果他们的检查点足够陈旧则提供完整的快照。

所以,是的,将其公开为

IObservable<ChangeNotification<MyOrder>> OrderChanges { get;}

其中 ChangeNotification 传达更新插入(带有新项目)、删除(ids/keys 删除)或重置。 如果正确完成,您将不会在任何地方使用主题 ;-)