C# 我应该使用可观察列表还是绑定列表来公开要放入UI中的更改数据

C# 我应该使用可观察列表还是绑定列表来公开要放入UI中的更改数据,c#,signalr,system.reactive,bindinglist,C#,Signalr,System.reactive,Bindinglist,我正在尝试以ViewModel优先的方式使用Rx(Xamarin表单)。我有点不确定的是,将数据模型需要提供给视图模型的不断变化的信息公开给视图模型的最佳方式 我有一个服务,它为我的客户端提供数据快照,然后通过信号器提供更新事件,指示添加、更新和删除。我已经为我的客户机数据模型编写了一个应用程序包装器,它可以登录、管理状态和常规连接,并且有一个本地数据库(在我的例子中是SqlLite) 我想要的是用不断变化的事件公开应用程序包装器上的数据,这样我就可以绑定到事件并创建一个可观察的集合,然后在WP

我正在尝试以ViewModel优先的方式使用Rx(Xamarin表单)。我有点不确定的是,将数据模型需要提供给视图模型的不断变化的信息公开给视图模型的最佳方式

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

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

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

  • 我想在登录后获得所有本地项目的完整列表
  • 我希望收到更改(添加、更新和删除)的通知并作出反应
  • 我想将上述内容转换为视图模型和可观察的集合(视情况而定)
  • 我希望能够订阅一个给定的集合,并获取当前我本地的所有条目,但也可以通过SignalR监视可能发生的更改。这应该是Rx吗?或者我应该将Rx隐藏在BindingList后面(例如)

    事实也是如此:

    IObservable<MyOrder> Orders { get; } // What kind of subject?
    
    IObservable Orders{get;}//什么类型的主题?
    

    BindingList命令{get;}
    
    还是别的什么


    如果是Rx,我应该做些什么来确保每个订户都获得当前订单列表,然后进行更改?

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

    BindingList<MyOrder> Orders { get; }
    
    BindingList命令{get;}
    
    然后,我认为VM将订阅一系列可观察的更改通知。这听起来像是你的信号频道已经提供给你了。在以前的项目中,我们将Add/Insert和Update合并到一个“upsert”消息中,然后还有Remove/Delete和Clear/Reset消息

    试图在本地管理状态所遇到的困难是“世界状态”问题。如果尝试先获取当前快照,然后订阅活动值,则在读取快照时可能会丢失一个值。但是,如果先订阅然后获取快照,则可能会收到两次值。在这种情况下,在处理快照之前,还必须对实时数据进行排队

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

    所以,是的,把它作为一个

    IObservable<ChangeNotification<MyOrder>> OrderChanges { get;}
    
    IObservable OrderChanges{get;}
    
    其中,
    ChangeNotification
    传递Upsert(带有新项目)、删除(带有要删除的ID/键)或重置。
    如果主题做得好,你就不会在任何地方使用;-)

    谢谢你花时间来理解这个问题,并给了我一个像样的答复。我在猜测我自己能看到的变化。我可能倾向于在VM级别公开一个可观察的集合。出于兴趣,在Rx中不使用主题有什么意义?出于某种原因,它们看起来很忌讳。很可能是我开始忌讳的。但正如发明家埃里克(Erik)也建议避免使用它们一样,我并不认为我是个疯子。作为一个通用的编码规则,我不认为你必须证明不使用工具是正当的,但是相反,你的责任应该是证明使用工具的成本是正当的。在最近的一篇帖子()中,我声明主题是接收,就像
    GOTO
    是C#一样。该示例展示了一个不使用它们并显著减少代码的示例。如果您想知道如何建立反应性GUI,以及其他可能超出缓存、安全性、配置、负载等缓存之外的关注点,请检查RACTCONF或YOW的演示文稿。
    IObservable<ChangeNotification<MyOrder>> OrderChanges { get;}