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

时间:2015-03-04 10:56:26

标签: xamarin.ios xamarin mvvmcross

如何在Xamarin.iOS和MVVMCross中的UICollectionView中添加Section头。 我只想问最好的方法。我在2天内搜索但无法找到任何简单的方法。我的数据是List和Section Contain List

我的设计看起来像

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

CollectionViews的一个好的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 :(得分:0)

派对有点晚了,但在这里你有我的工作代码:

  1. 使用集合中的多个部分
  2. 为每个部分使用标题
  3. 方便时更改数据:

    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);
        }
    }