private View CreateView(HeaderedItem next)
        {
            var  h = next.Header;
            View view;

            if (h != null)
            {
                view = HeaderTemplate?.CreateContent() as View ?? new Label {
                };
                view.BindingContext = h;
                return(view);
            }

            view = ItemTemplate?.CreateContent() as View ?? new Label {
            };
            view.BindingContext = next.Item;
            SetItemModel(view, next);
            return(view);
        }
        private List <HeaderedItem> GenerateItems(IEnumerable source)
        {
            var items = new List <HeaderedItem>();
            var s     = (source as IList) ?? (new List <object>(source.Cast <object>()));

            if (IsGroupingEnabled)
            {
                int index = 0;
                // enumerate and create group....
                foreach (var gitem in s)
                {
                    var g = new HeaderedItem
                    {
                        Header = gitem,
                        Index  = index++
                    };

                    items.Add(g);
                    foreach (var item in (IEnumerable)gitem)
                    {
                        items.Add(new HeaderedItem
                        {
                            Item  = item,
                            Index = index++
                        });
                    }
                }
            }
            else
            {
                for (var i = 0; i < s.Count; i++)
                {
                    var item = s[i];
                    items.Add(new HeaderedItem
                    {
                        Item  = item,
                        Index = i
                    });
                }
            }

            return(items);
        }
                                            null);//OnItemHeaderChanged);

        /*private static void OnItemHeaderChanged(BindableObject bindable, object oldValue, object newValue)
         * {
         *
         * }*/

        /// <summary>
        /// Set ItemHeader for bindable object
        /// </summary>
        /// <param name="bindable"></param>
        /// <param name="newValue"></param>
        private static void SetItemModel(BindableObject bindable, HeaderedItem newValue)
        {
            bindable.SetValue(ItemModelProperty, newValue);
        }