C# UICollectionView在Xamarin中未正确更新

C# UICollectionView在Xamarin中未正确更新,c#,ios,xamarin,uicollectionview,C#,Ios,Xamarin,Uicollectionview,在我的应用程序中,我有一个非常特殊的用法UICollectionView(CV),包含4个或更少的单元格 CV设置为填充两个控件之间的屏幕(顶部控件定位到父视图的顶部,底部控件定位到父视图的底部)。在我的ViewModel中,我使用了一个observateCollection来保存项目,还有一个自定义的MvxCollectionViewSource(CVS),它执行以下操作: 定义两种单元格类型 定义自定义的CollectionViewLayout(我使用的是基于屏幕大小的动态大小单元格,单个

在我的应用程序中,我有一个非常特殊的用法
UICollectionView
CV
),包含4个或更少的单元格

CV
设置为填充两个控件之间的屏幕(顶部控件定位到父视图的顶部,底部控件定位到父视图的底部)。在我的ViewModel中,我使用了一个
observateCollection
来保存项目,还有一个自定义的
MvxCollectionViewSource
CVS
),它执行以下操作:

  • 定义两种单元格类型
  • 定义自定义的
    CollectionViewLayout
    (我使用的是基于屏幕大小的动态大小单元格,单个单元格可以占据屏幕的1/2减去两侧的8.0填充和中间的64.0填充,保留给图标)
  • 将项的索引(
    indexPath.Row
    )传递给项(供将来显示)
  • 将命令从ViewModel传递到单元格(单元格具有绑定到此命令的“删除”按钮)
  • 覆盖
    GetItemsCount
    ,因此如果实际项目计数低于设置的限制(现在是4),我们总是返回+1(添加按钮)
ViewModel还有一个用于
CVS
SelectionChanged
的命令,它所做的只是导航到一个新的ViewModel,该ViewModel允许编辑所选项目的属性

我的主要问题是,在所有四项都出现之前,这些项似乎无法更新(一个值表示主项中子项的总数)。我尝试在
CV
上调用
ReloadData
,但没有成功。但是如果我有全部四个项目,更新工作就很好

代码如下:

公共部分类MyView:MvxViewController{
受保护的MyCollectionSource CollectionViewSource{get;set;}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
this.CollectionViewSource=新的MyCollectionSource(this.CollectionView);
var set=this.CreateBindingSet();
set.Bind(this.CollectionViewSource).To(vm=>vm.Items);
set.Bind(this.CollectionViewSource).For(s=>s.SelectionChangedCommand).To(vm=>vm.ShowDetailCommand);
set.Apply();
CollectionViewSource.RemoveCommand=ViewModel.RemoveCommand;
this.CollectionView.Source=CollectionViewSource;
this.CollectionView.AllowSelection=true;
this.CollectionView.ApplySelectionWorkAround();
this.CollectionView.ReloadData();
}
}
公共类MyCollectionSource:MvxCollectionViewSource
{
公共IMvxCommand RemoveCommand{get;set;}
公共MyCollectionSource(UICollectionView collectionView):基础(collectionView)
{
registernbforcell(ItemCell.Nib,ItemCell.Key);
registernbforcell(AddItemCell.Nib,AddItemCell.Key);
collectionView.CollectionViewLayout=新项目视图布局();
}
受保护的覆盖UICollectionViewCell GetOrCreateCellFor(UICollectionView collectionView,NSIndexPath indexPath,对象项)
{
return(UICollectionViewCell)collectionView.DequeueReusableCell(GetCellKey(indexPath),indexPath);
}
受保护的覆盖对象GetItemAt(NSIndexPath indexPath)
{
if(indexath.Item==ItemsSource.Count())返回null;
var item=base.GetItemAt(indexPath);
如果(项目为项目realItem)
{
realItem.RemoveCommand=(IMvxCommand)this.RemoveCommand;
realItem.Index=indexPath.Row+1;
}
退货项目;
}
私有NSString GetCellKey(NSIndexPath indexPath)
{
if(indexath.Item==ItemsSource.Count())返回AddItemCell.Key;
返回ItemCell.Key;
}
公共覆盖nint GetItemsCount(UICollectionView collectionView,nint部分)
{
返回ItemsSource.Count()
我已尝试在
视图将出现
、在
视图模型属性更改
上重新加载项目(如果属性名称是用于保存项目的
ObservableCollection
),尝试将RaisePropertyChanged调用放在导航回MyView的任何位置,但没有成功。但是,同样-如果
ItemsSource.Count()
是最大值,它可以正常工作,但如果是较小值,则不能正常工作

我正在使用MvvmCross 5.1.1和新的导航模式,将所选项目作为参数传递给详细视图


如何强制CollectionView显示最新数据?

您在UICollectionView中没有看到任何错误,如“断言失败”或NSinternalinconsistenceException?没有,没有类似的错误。我甚至可以看到引发的PropertyChanged事件,但即使CollectionViewSource已绑定,也不会发生任何事情。您没有从UICollectionView中看到任何错误,如“断言失败”或NsinternalinconConsistencyException?不,不是这样的。我甚至可以看到引发的PropertyChanged事件,但即使CollectionViewSource已绑定,也不会发生任何事情。