如何在Xamarin.forms中保留共享数据而不使用单例

如何在Xamarin.forms中保留共享数据而不使用单例,xamarin.forms,singleton,Xamarin.forms,Singleton,我有一个ContentPage和一个ListView。我正在使用另一个内容页的按钮导航到此内容页。此按钮显示列表项计数。我已将ViewModel连接到每个内容页。我可以在将项目添加到我的ObservableCollection时更新计数,因为字段不是从列表页面添加的。但是,当我从列表视图中删除一个项目时,我也想更新该时间的计数。如何将此ObservableCollection保持为这两个内容页之间的共享内容?我知道使用Singleton类我们可以做到这一点。但由于我的代码应该支持单元测试,所以我

我有一个
ContentPage
和一个
ListView
。我正在使用另一个内容页的按钮导航到此内容页。此按钮显示列表项计数。我已将
ViewModel
连接到每个内容页。我可以在将项目添加到我的
ObservableCollection
时更新计数,因为字段不是从列表页面添加的。但是,当我从列表视图中删除一个项目时,我也想更新该时间的计数。如何将此
ObservableCollection
保持为这两个
内容页之间的共享内容?我知道使用
Singleton
类我们可以做到这一点。但由于我的代码应该支持单元测试,所以我似乎无法做到这一点


在这些内容页之间共享此
可观察集合的最佳方法是什么?

如果您想要共享的唯一信息是列表中项目的实际计数,您可以使用Xamarin表单中内置的MessagingService

因此,在您的示例中,可以创建一个类,该类保存您想要共享的所有信息,并在一个页面中执行以下操作:

MessagingCenter.Send<ShareInfo>(...)
MessagingCenter.Send(…)
所以你可以传递数据

在另一页里,你要做什么

MessagingCenter.Subscribe<ShareInfo>(...)
MessagingCenter.Subscribe(…)

接收数据并使用该数据更新按钮计数。

如果我理解正确,您需要在多个
视图模型之间共享单个数据存储库。这意味着您需要在代码库的某个位置保留存储库的单个实例。根据您的项目设置,此存储库可以位于IOC容器中,也可以作为
App
类中的简单属性或其他位置。此外,根据集合数据类型,您可能还需要将数据持久化到SQL、本地存储等。这样,从应用程序中的任何ViewModel访问集合将变得非常简单


但是,由于我不完全理解您的意图,可能还有其他解决方案。例如将集合的引用传递到下一页等等。

在一个非常简单的场景中,将ObservableCollection的引用传递到PageB应该可以做到这一点。PageB如何知道当前列表中有多少项?@EvZ在第一页中,我有一个可观察的集合,当添加项时,我得到集合计数。为此,我使用了一个singleton类来保存集合。但是我想避免提及这一点,
取消订阅
也是必需的。eww..您刚才建议使用消息服务吗?我宁愿写VB代码