protected TableViewSourceBase([NotNull] UITableView tableView, string itemTemplate = AttachedMemberConstants.ItemTemplate)
        {
            Should.NotBeNull(tableView, nameof(tableView));
            _tableView        = ToolkitServiceProvider.WeakReferenceFactory(tableView);
            _templateProvider = new DataTemplateProvider <ITableCellTemplateSelector>(tableView, itemTemplate);
            var controllerView = tableView.FindParent <IViewControllerView>();

            if (controllerView != null && !(controllerView is IMvvmNavigationController))
            {
                _listener = ReflectionExtensions.CreateWeakEventHandler <TableViewSourceBase, EventArgs>(this, (adapter, o, arg3) => adapter.OnDisposeController(o, arg3));
                controllerView.Mediator.DisposeHandler += _listener.Handle;
            }

            UseAnimations = tableView
                            .GetBindingMemberValue(AttachedMembers.UITableView.UseAnimations)
                            .GetValueOrDefault(true);
            AddAnimation = tableView
                           .GetBindingMemberValue(AttachedMembers.UITableView.AddAnimation)
                           .GetValueOrDefault(UITableViewRowAnimation.Automatic);
            RemoveAnimation = tableView
                              .GetBindingMemberValue(AttachedMembers.UITableView.RemoveAnimation)
                              .GetValueOrDefault(UITableViewRowAnimation.Automatic);
            ReplaceAnimation = tableView
                               .GetBindingMemberValue(AttachedMembers.UITableView.ReplaceAnimation)
                               .GetValueOrDefault(UITableViewRowAnimation.Automatic);
            ScrollPosition = tableView
                             .GetBindingMemberValue(AttachedMembers.UITableView.ScrollPosition)
                             .GetValueOrDefault(UITableViewScrollPosition.Middle);
        }
        protected TableViewSourceBase([NotNull] UITableView tableView,
            string itemTemplate = AttachedMemberConstants.ItemTemplate)
        {
            Should.NotBeNull(tableView, nameof(tableView));
            _tableView = ServiceProvider.WeakReferenceFactory(tableView);
            _templateProvider = new DataTemplateProvider(tableView, itemTemplate);
            var controllerView = tableView.FindParent<IViewControllerView>();
            if (controllerView != null && !(controllerView is IMvvmNavigationController))
            {
                _listener = ReflectionExtensions.CreateWeakEventHandler<TableViewSourceBase, EventArgs>(this, (adapter, o, arg3) => adapter.OnDisposeController(o, arg3));
                controllerView.Mediator.DisposeHandler += _listener.Handle;
            }

            UseAnimations = tableView
                .GetBindingMemberValue(AttachedMembers.UITableView.UseAnimations)
                .GetValueOrDefault(true);
            AddAnimation = tableView
                .GetBindingMemberValue(AttachedMembers.UITableView.AddAnimation)
                .GetValueOrDefault(UITableViewRowAnimation.Automatic);
            RemoveAnimation = tableView
                .GetBindingMemberValue(AttachedMembers.UITableView.RemoveAnimation)
                .GetValueOrDefault(UITableViewRowAnimation.Automatic);
            ReplaceAnimation = tableView
                .GetBindingMemberValue(AttachedMembers.UITableView.ReplaceAnimation)
                .GetValueOrDefault(UITableViewRowAnimation.Automatic);
            ScrollPosition = tableView
                .GetBindingMemberValue(AttachedMembers.UITableView.ScrollPosition)
                .GetValueOrDefault(UITableViewScrollPosition.Middle);
        }
        protected CollectionViewSourceBase([NotNull] UICollectionView collectionView,
            string itemTemplate = AttachedMemberConstants.ItemTemplate)
        {
            Should.NotBeNull(collectionView, nameof(collectionView));
            _collectionView = PlatformExtensions.CreateWeakReference(collectionView);
            _itemTemplateProvider = new DataTemplateProvider(collectionView, itemTemplate);
            var controllerView = collectionView.FindParent<IViewControllerView>();
            if (controllerView != null && !(controllerView is IMvvmNavigationController))
            {
                _listener = ReflectionExtensions.CreateWeakEventHandler<CollectionViewSourceBase, EventArgs>(this, (adapter, o, arg3) => adapter.OnDisposeController(o, arg3));
                controllerView.Mediator.DisposeHandler += _listener.Handle;
            }

            UseAnimations = collectionView
                .GetBindingMemberValue(AttachedMembers.UICollectionView.UseAnimations)
                .GetValueOrDefault(true);
            ScrollPosition = collectionView
                .GetBindingMemberValue(AttachedMembers.UICollectionView.ScrollPosition)
                .GetValueOrDefault(UICollectionViewScrollPosition.Top);
        }
        protected CollectionViewSourceBase([NotNull] UICollectionView collectionView,
                                           string itemTemplate = AttachedMemberConstants.ItemTemplate)
        {
            Should.NotBeNull(collectionView, nameof(collectionView));
            _collectionView       = TouchToolkitExtensions.CreateWeakReference(collectionView);
            _itemTemplateProvider = new DataTemplateProvider <ICollectionCellTemplateSelector>(collectionView, itemTemplate);
            var controllerView = collectionView.FindParent <IViewControllerView>();

            if (controllerView != null && !(controllerView is IMvvmNavigationController))
            {
                _listener = ReflectionExtensions.CreateWeakEventHandler <CollectionViewSourceBase, EventArgs>(this, (adapter, o, arg3) => adapter.OnDisposeController(o, arg3));
                controllerView.Mediator.DisposeHandler += _listener.Handle;
            }

            UseAnimations = collectionView
                            .GetBindingMemberValue(AttachedMembers.UICollectionView.UseAnimations)
                            .GetValueOrDefault(true);
            ScrollPosition = collectionView
                             .GetBindingMemberValue(AttachedMembers.UICollectionView.ScrollPosition)
                             .GetValueOrDefault(UICollectionViewScrollPosition.Top);
        }