C# 带节的MvxCollectionViewController

C# 带节的MvxCollectionViewController,c#,xamarin.ios,mvvmcross,C#,Xamarin.ios,Mvvmcross,使用Xamarin.iOS和MvvmCross,我试图创建一个包含节的MvxCollectionViewController,每个节包含一个标题和一组MvxCollectionViewCell(基于MvvmCross教程) 如本教程所述,我已将MvxCollectionViewCell子类化。我有以下模型和ViewModel层次结构(改编自教程): 每个部分的ViewModel: public class KittenSectionViewModel : MvxViewModel { p

使用Xamarin.iOS和MvvmCross,我试图创建一个包含节的
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; } }