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
),它执行以下操作:
- 定义两种单元格类型
- 定义自定义的
(我使用的是基于屏幕大小的动态大小单元格,单个单元格可以占据屏幕的1/2减去两侧的8.0填充和中间的64.0填充,保留给图标)CollectionViewLayout
- 将项的索引(
)传递给项(供将来显示)indexPath.Row
- 将命令从ViewModel传递到单元格(单元格具有绑定到此命令的“删除”按钮)
- 覆盖
,因此如果实际项目计数低于设置的限制(现在是4),我们总是返回+1(添加按钮)GetItemsCount
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已绑定,也不会发生任何事情。