C# 带节的MvxCollectionViewController
使用Xamarin.iOS和MvvmCross,我试图创建一个包含节的C# 带节的MvxCollectionViewController,c#,xamarin.ios,mvvmcross,C#,Xamarin.ios,Mvvmcross,使用Xamarin.iOS和MvvmCross,我试图创建一个包含节的MvxCollectionViewController,每个节包含一个标题和一组MvxCollectionViewCell(基于MvvmCross教程) 如本教程所述,我已将MvxCollectionViewCell子类化。我有以下模型和ViewModel层次结构(改编自教程): 每个部分的ViewModel: public class KittenSectionViewModel : MvxViewModel { p
MvxCollectionViewController
,每个节包含一个标题和一组MvxCollectionViewCell
(基于MvvmCross教程)
如本教程所述,我已将MvxCollectionViewCell
子类化。我有以下模型和ViewModel层次结构(改编自教程):
每个部分的ViewModel:
public class KittenSectionViewModel : MvxViewModel
{
private string _sectionName;
public string SectionName
{
get { return _sectionName; }
set { _sectionName = value; RaisePropertyChanged(() => SectionName); }
}
private List<Kitten> _kittens;
public List<Kitten> Kittens
{
get { return _kittens; }
set { _kittens = value; RaisePropertyChanged(() => Kittens); }
}
}
最后,我实现了一个自定义的MvxCollectionViewSource
,我将其分配给CollectionView的源:
public class KittenCollectionViewSource : MvxCollectionViewSource
{
KittensViewModel KittensViewModel { get; set; }
public KittenCollectionViewSource (KittensViewModel kittensViewModel, UICollectionView collectionView, NSString defaultCellIdentifier) : base (collectionView, defaultCellIdentifier)
{
this.KittensViewModel = kittensViewModel;
}
public override int GetItemsCount (UICollectionView collectionView, int section)
{
return KittensViewModel.KittenSections [section].Kittens.Count;
}
public override int NumberOfSections (UICollectionView collectionView)
{
return KittensViewModel.KittenSections.Count;
}
protected override UICollectionViewCell GetOrCreateCellFor (UICollectionView collectionView, NSIndexPath indexPath, object item)
{
return collectionView.DequeueReusableCell (DefaultCellIdentifier, indexPath) as KittenCollectionCell;
}
}
(完整的解决方案可在上获得)
问题是,
KittenCollectionCell
需要绑定到一个Kitten
,但是由于模型被包装在不同的viewmodel中,我不知道如何告诉MvxCollectionViewSource
使用内部模型 源代码的结构看起来相当简单-因此我认为您缺少的是GetItemAt
覆盖-请参阅
我认为您需要添加以下内容:
protected override object GetItemAt(NSIndexPath indexPath)
{
if (KittensViewModel == null)
return null;
return KittensViewModel
.KittenSections[indexPath.Section]
.Kittens[indexPath.Row];
}
您还可以将KittensViewModel
实现为:
protected KittensViewModel KittensViewModel { get { return base.ItemsSource as KittensViewModel; } }
谢谢@Stuart你是个传奇人物。我曾经在ctor中传递数据源,但不知道我有权访问ItemsSource。你让我开心:)
public class KittenCollectionViewSource : MvxCollectionViewSource
{
KittensViewModel KittensViewModel { get; set; }
public KittenCollectionViewSource (KittensViewModel kittensViewModel, UICollectionView collectionView, NSString defaultCellIdentifier) : base (collectionView, defaultCellIdentifier)
{
this.KittensViewModel = kittensViewModel;
}
public override int GetItemsCount (UICollectionView collectionView, int section)
{
return KittensViewModel.KittenSections [section].Kittens.Count;
}
public override int NumberOfSections (UICollectionView collectionView)
{
return KittensViewModel.KittenSections.Count;
}
protected override UICollectionViewCell GetOrCreateCellFor (UICollectionView collectionView, NSIndexPath indexPath, object item)
{
return collectionView.DequeueReusableCell (DefaultCellIdentifier, indexPath) as KittenCollectionCell;
}
}
protected override object GetItemAt(NSIndexPath indexPath)
{
if (KittensViewModel == null)
return null;
return KittensViewModel
.KittenSections[indexPath.Section]
.Kittens[indexPath.Row];
}
protected KittensViewModel KittensViewModel { get { return base.ItemsSource as KittensViewModel; } }