UICollectionView 帮助 在 MVVMCross Xamarin 中添加部分的最佳方式是什么?

UICollectionView Help What is the Best Way for adding section in MVVMCross Xamarin?

如何在 Xamarin.iOS 和 MVVMCross 中的 UICollectionView 中添加 Section headers。 我只想问最好的方法。我从 2 天开始搜索,但找不到任何简单的方法。我的数据是 List and Section Contain List

我的设计看起来像

要在 UICollectionView 中添加补充视图,您需要覆盖 CollectionViewSource 以提供它们。

MvvmCross 中的基本代码在 https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Touch/Views/MvxCollectionViewSource.cs and https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Touch/Views/MvxBaseCollectionViewSource.cs

一个很好的 CollectionView Xamarin 教程是 http://developer.xamarin.com/guides/ios/user_interface/introduction_to_collection_views/

如果你想让补充视图可绑定,那么你可以通过以类似于单元格的方式调整补充视图来实现这些 - 例如从 https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Touch/Views/MvxCollectionViewCell.cs 复制并粘贴 BindingContext`DataContext` 代码,然后确保在集合视图源中使用或重复使用补充单元格时设置 DataContext。

在 MvvmCross 或示例中有一个请求此功能的未决问题 - https://github.com/MvvmCross/MvvmCross/issues/339 - 但没有人(除了我!)对此发表评论......很高兴看到它被添加。

聚会有点晚了,但这里有我的工作代码:

  1. 在 collection
  2. 中使用多个部分
  3. 每个部分使用 header

在您方便的时候更改数据:

public class SearchCollectionViewSource : MvxCollectionViewSource
{
    private List<SearchResult> results { get { return ItemsSource as List<SearchResult>; } }

    public SearchCollectionViewSource (UICollectionView collectionView) : base(collectionView) { }

    public SearchCollectionViewSource (UICollectionView collectionView, NSString defaultCellIdentifier) : base(collectionView, defaultCellIdentifier) { }

    public override UICollectionReusableView GetViewForSupplementaryElement (UICollectionView collectionView, NSString elementKind, NSIndexPath indexPath)
    {
        return (HeaderView)collectionView.DequeueReusableSupplementaryView(elementKind, HeaderView.Key, indexPath);
    }

    public override nint NumberOfSections (UICollectionView collectionView)
    {
        return results.Count;
    }
    public override nint GetItemsCount (UICollectionView collectionView, nint section)
    {
        return results[(int)section].photos.Count;
    }

    protected override object GetItemAt(NSIndexPath indexPath)
    {
        return results [indexPath.Section].photos [indexPath.Row];
    }
}

public sealed class HeaderView : UICollectionReusableView
{
    public static string Key = "HeaderId";

    [Export("initWithFrame:")]
    public HeaderView(System.Drawing.RectangleF frame)
        : base(frame)
    {
        UIView separator = new UIView() { Frame = new System.Drawing.RectangleF(0, 0, (float)UIScreen.MainScreen.Bounds.Width, 10), BackgroundColor = UIColor.LightGray };
        AddSubview(separator);
    }
}