我是否应该使用Observable或BindingList来暴露我想要放到UI中的变化数据?

本文关键字:UI 我想要 数据 变化 暴露 是否 BindingList Observable | 更新日期: 2023-09-27 18:13:27

我试图让自己进入使用Rx (Xamarin Forms)在ViewModel第一方法。我有点不确定的是,将数据模型需要提供给视图模型的不断变化的信息公开的最佳方式是什么。

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

我想要的是在我的应用程序包装器上公开数据,改变事件,这样我就可以绑定到事件并创建一个可观察的集合,然后我可以在WPF/Xamarin中使用。

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

  1. 我想在登录后获得所有本地项目的完整列表
  2. 我想被通知的变化(添加,更新和删除)和反应
  3. 我想把上面的转换成视图模型和一个适当的可观察集合。

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

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

BindingList<MyOrder> Orders { get; }

还是别的什么?

如果是Rx,我应该做些什么来确保每个订阅者都得到当前的订单列表,然后得到更改?

我是否应该使用Observable或BindingList来暴露我想要放到UI中的变化数据?

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

BindingList<MyOrder> Orders { get; }

那么我认为VM会订阅一个可观察的更改通知序列。听起来你的SignalR频道已经提供了这个功能。在之前的项目中,我们将添加/插入和更新合并为单个"upsert"消息,然后也有删除/删除和清除/重置消息。

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

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

所以,是的,将它暴露为

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

其中ChangeNotification传递了Upsert(带有新项),delete(带有要删除的id/键)或Reset。如果处理得当,你不会在任何地方使用主题;-)