Xamarin.forms ReadOnlyObservableCollection显示重复的值
我的Xamarin.forms ReadOnlyObservableCollection显示重复的值,xamarin.forms,dynamic-data,Xamarin.forms,Dynamic Data,我的CollectionView每次显示页面时都会显示重复的对象,这意味着我第一次会有一个对象(这是正常的),但是如果我导航并返回到该页面,它会复制同一个对象,所以我会得到两次,然后三次..等等 下面是我的页面的ViewModel的构造函数中的代码: Cache .AutoRefresh(x => x.Code) .ObserveOn(RxApp.MainThreadScheduler) .Bi
CollectionView
每次显示页面时都会显示重复的对象,这意味着我第一次会有一个对象(这是正常的),但是如果我导航并返回到该页面,它会复制同一个对象,所以我会得到两次,然后三次..等等
下面是我的页面的ViewModel的构造函数中的代码:
Cache
.AutoRefresh(x => x.Code)
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(out _list)
.DisposeMany();
\u列表
是一个只读可观察集合
Cache
是从Akavache
缓存中的GetAllObjects
获取的IObservable
_blobCache
.GetAllObjects<AddressModel>()
.ToObservableChangeSet(t => t.Code)
.AsObservableCache()
.Connect();
谢谢你的帮助或提示
更新
只有在选项卡之间导航时才会发生复制行为,如果我按下一个新页面并返回,我会再次找到1个对象,这是预期的行为
下面是设置页面绑定上下文的代码
在选项卡页面的代码隐藏中
public partial class MainTabbedPage : ReactiveTabbedPage<MainViewModel>
{
public MainTabbedPage()
{
InitializeComponent();
this.WhenActivated(
disposables =>
{
this
.OneWayBind(this.ViewModel, x => x.AddressVm, x => x.addressView.ViewModel)
.DisposeWith(disposables);
//other tabs...
});
}
}
我有一种感觉,你在用OnAppearing方法将数据分配给你的可观测集合
,这种方法基本上是一次又一次地被调用,从而添加重复的数据!但是如果不是这样的话,我们需要查看与此相关的所有代码,即xaml.cs和VM代码,否则我们只是在猜测!!!在分配数据的行上设置断点,并查看它得到的次数called@apex39带有Bind(out\u list)
的代码位于页面的ViewModel的构造函数中,是的,每次显示视图时都会调用它。为什么ViewModel的构造函数会调用多次?我的意思是,构造函数不只是被调用一次吗?是的,同意@apex39这一点。当每次你的视图被激活时都调用Activated时,我感觉你在用OnAppearing方法将数据分配给你的ObservableCollection
,该方法基本上被反复调用,反过来又添加重复的数据!但是如果不是这样的话,我们需要查看与此相关的所有代码,即xaml.cs和VM代码,否则我们只是在猜测!!!在分配数据的行上设置断点,并查看它得到的次数called@apex39带有Bind(out\u list)
的代码位于页面的ViewModel的构造函数中,是的,每次显示视图时都会调用它。为什么ViewModel的构造函数会调用多次?我的意思是,构造函数不只是被调用一次吗?是的,同意@apex39这个说法。WhenActivated是在每次视图被激活时被调用的
public partial class MainTabbedPage : ReactiveTabbedPage<MainViewModel>
{
public MainTabbedPage()
{
InitializeComponent();
this.WhenActivated(
disposables =>
{
this
.OneWayBind(this.ViewModel, x => x.AddressVm, x => x.addressView.ViewModel)
.DisposeWith(disposables);
//other tabs...
});
}
}
public AddressViewModel AddressVm => new AddressViewModel(HostScreen);
public MainViewModel(IScreen hostScreen) : base(hostScreen)
{
}