/// <summary>
		/// Initializes a new instance of the <see cref="DLToolkit.Forms.Controls.FlowListViewInternalCell"/> class.
		/// </summary>
		/// <param name="flowListViewRef">Flow list view reference.</param>
		public FlowListViewInternalCell(WeakReference<FlowListView> flowListViewRef)
		{
			_flowListViewRef = flowListViewRef;
			FlowListView flowListView = null;
			flowListViewRef.TryGetTarget(out flowListView);
			_useGridAsMainRoot = !flowListView.FlowUseAbsoluteLayoutInternally;

			if (!_useGridAsMainRoot)
			{
				_rootLayout = new AbsoluteLayout()
				{
					Padding = 0d,
					BackgroundColor = flowListView.FlowRowBackgroundColor,
				};
				View = _rootLayout;
			}
			else
			{
				_rootLayoutAuto = new Grid()
				{
					RowSpacing = 0d,
					ColumnSpacing = 0d,
					Padding = 0d,
					BackgroundColor = flowListView.FlowRowBackgroundColor,
				};
				View = _rootLayoutAuto;
			}

			_flowColumnTemplate = flowListView.FlowColumnTemplate;
			_desiredColumnCount = flowListView.DesiredColumnCount;
			_flowColumnExpand = flowListView.FlowColumnExpand;
		}
        /// <summary>
        /// Initializes a new instance of the <see cref="DLToolkit.Forms.Controls.FlowListViewInternalCell"/> class.
        /// </summary>
        /// <param name="flowListViewRef">Flow list view reference.</param>
        public FlowListViewInternalCell(WeakReference <FlowListView> flowListViewRef)
        {
            _flowListViewRef = flowListViewRef;
            flowListViewRef.TryGetTarget(out FlowListView flowListView);
            _useGridAsMainRoot = !flowListView.FlowUseAbsoluteLayoutInternally;

            if (!_useGridAsMainRoot)
            {
                _rootLayout = new AbsoluteLayout()
                {
                    Padding         = 0d,
                    BackgroundColor = flowListView.FlowRowBackgroundColor,
                };
                View = _rootLayout;
            }
            else
            {
                _rootLayoutAuto = new Grid()
                {
                    RowSpacing      = 0d,
                    ColumnSpacing   = 0d,
                    Padding         = 0d,
                    BackgroundColor = flowListView.FlowRowBackgroundColor,
                };
                View = _rootLayoutAuto;
            }

            _flowColumnTemplate = flowListView.FlowColumnTemplate;
            _desiredColumnCount = flowListView.FlowDesiredColumnCount;
            _flowColumnExpand   = flowListView.FlowColumnExpand;

            View.GestureRecognizers.Clear();
            View.GestureRecognizers.Add(new TapGestureRecognizer());
        }
		/// <summary>
		/// Initializes a new instance of the <see cref="DLToolkit.Forms.Controls.FlowListViewInternalCell"/> class.
		/// </summary>
		/// <param name="flowListViewRef">Flow list view reference.</param>
		public FlowListViewInternalCell(WeakReference<FlowListView> flowListViewRef)
		{
			this.flowListViewRef = flowListViewRef;
			FlowListView flowListView = null;
			flowListViewRef.TryGetTarget(out flowListView);

			rootLayout = new AbsoluteLayout() {
				HorizontalOptions = LayoutOptions.FillAndExpand,
				VerticalOptions = LayoutOptions.FillAndExpand,
				Padding = 0d,
				BackgroundColor = flowListView.FlowRowBackgroundColor,
			};

			View = rootLayout;

			flowColumnsTemplates = flowListView.FlowColumnsTemplates;
			desiredColumnCount = flowListView.DesiredColumnCount;
			flowAutoColumnCount = flowListView.FlowAutoColumnCount;
			flowColumnExpand = flowListView.FlowColumnExpand;
		}
示例#4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DLToolkit.Forms.Controls.FlowListViewInternalCell"/> class.
        /// </summary>
        /// <param name="flowListViewRef">Flow list view reference.</param>
        public FlowListViewInternalCell(WeakReference <FlowListView> flowListViewRef)
        {
            this.flowListViewRef = flowListViewRef;
            FlowListView flowListView = null;

            flowListViewRef.TryGetTarget(out flowListView);

            rootLayout = new AbsoluteLayout()
            {
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions   = LayoutOptions.FillAndExpand,
                Padding           = 0d,
                BackgroundColor   = flowListView.FlowRowBackgroundColor,
            };

            View = rootLayout;

            flowColumnsTemplates = flowListView.FlowColumnsTemplates;
            desiredColumnCount   = flowListView.DesiredColumnCount;
            flowAutoColumnCount  = flowListView.FlowAutoColumnCount;
            flowColumnExpand     = flowListView.FlowColumnExpand;
        }
        private void UpdateData()
        {
            if (!(BindingContext is IList container))
            {
                return;
            }

            var newDesiredColumnCount = 0;

            if (_flowListViewRef.TryGetTarget(out FlowListView flowListView) && flowListView != null)
            {
                _flowColumnTemplate   = flowListView.FlowColumnTemplate;
                newDesiredColumnCount = flowListView.FlowDesiredColumnCount;
                _flowColumnExpand     = flowListView.FlowColumnExpand;
            }

            var flowGroupColumn = BindingContext as FlowGroupColumn;

            if (flowGroupColumn != null)
            {
                newDesiredColumnCount = flowGroupColumn.ColumnCount;
            }

            // Getting view types from templates
            var containerCount             = container.Count;
            IList <DataTemplate> templates = GetDataTemplates(container);

            bool layoutChanged = false;

            if (flowGroupColumn != null && flowGroupColumn.ForceInvalidateColumns)
            {
                layoutChanged = true;
                flowGroupColumn.ForceInvalidateColumns = false;
            }
            else
            {
                layoutChanged = RowLayoutChanged(containerCount, templates, newDesiredColumnCount);
            }

            _desiredColumnCount = newDesiredColumnCount;

            if (!layoutChanged) // REUSE VIEWS
            {
                if (_useGridAsMainRoot)
                {
                    for (int i = 0; i < containerCount; i++)
                    {
                        SetBindingContextForView(_rootLayoutAuto.Children[i], container[i]);
                    }
                }
                else
                {
                    for (int i = 0; i < containerCount; i++)
                    {
                        SetBindingContextForView(_rootLayout.Children[i], container[i]);
                    }
                }
            }
            else // RECREATE COLUMNS
            {
                _currentColumnTemplates = new List <DataTemplate>(templates);

                if (_useGridAsMainRoot)
                {
                    if (_rootLayoutAuto.Children.Count > 0)
                    {
                        _rootLayoutAuto.Children.Clear();
                    }

                    var colDefs = new ColumnDefinitionCollection();
                    for (int i = 0; i < _desiredColumnCount; i++)
                    {
                        colDefs.Add(new ColumnDefinition()
                        {
                            Width = new GridLength(1d, GridUnitType.Star)
                        });
                    }
                    _rootLayoutAuto.ColumnDefinitions = colDefs;

                    for (int i = 0; i < containerCount; i++)
                    {
                        if (!(templates[i].CreateContent() is View view))
                        {
                            throw new InvalidCastException("DataTemplate must return a View");
                        }

                        AddTapGestureToView(view);

                        SetBindingContextForView(view, container[i]);
                        if (containerCount == 0 || _desiredColumnCount == 0)
                        {
                            return;
                        }

                        AddViewToLayoutAutoHeightEnabled(view, containerCount, i);
                    }
                }
                else
                {
                    if (_rootLayout.Children.Count > 0)
                    {
                        _rootLayout.Children.Clear();
                    }

                    for (int i = 0; i < containerCount; i++)
                    {
                        if (!(templates[i].CreateContent() is View view))
                        {
                            throw new InvalidCastException("DataTemplate must return a View");
                        }

                        AddTapGestureToView(view);

                        SetBindingContextForView(view, container[i]);
                        if (containerCount == 0 || _desiredColumnCount == 0)
                        {
                            return;
                        }

                        AddViewToLayoutAutoHeightDisabled(view, containerCount, i);
                    }
                }
            }
        }
        /// <summary>
        /// Override this method to execute an action when the BindingContext changes.
        /// </summary>
        /// <remarks></remarks>
        protected override void OnBindingContextChanged()
        {
            base.OnBindingContextChanged();

            var container = BindingContext as IList;

            if (container == null)
            {
                return;
            }

            FlowListView flowListView = null;

            if (_flowListViewRef.TryGetTarget(out flowListView) && flowListView != null)
            {
                _flowColumnTemplate = flowListView.FlowColumnTemplate;
                _desiredColumnCount = flowListView.DesiredColumnCount;
                _flowColumnExpand   = flowListView.FlowColumnExpand;
            }

            // Getting view types from templates
            var containerCount             = container.Count;
            IList <DataTemplate> templates = GetDataTemplates(container);
            bool layoutChanged             = RowLayoutChanged(containerCount, templates);

            if (!layoutChanged)             // REUSE VIEWS
            {
                if (_useGridAsMainRoot)
                {
                    for (int i = 0; i < containerCount; i++)
                    {
                        SetBindingContextForView(_rootLayoutAuto.Children[i], container[i]);
                    }
                }
                else
                {
                    for (int i = 0; i < containerCount; i++)
                    {
                        SetBindingContextForView(_rootLayout.Children[i], container[i]);
                    }
                }
            }
            else             // RECREATE COLUMNS
            {
                if (_useGridAsMainRoot)
                {
                    if (_rootLayoutAuto.Children.Count > 0)
                    {
                        _rootLayoutAuto.Children.Clear();
                    }
                }
                else
                {
                    if (_rootLayout.Children.Count > 0)
                    {
                        _rootLayout.Children.Clear();
                    }
                }

                _currentColumnTemplates = new List <DataTemplate>(templates);

                for (int i = 0; i < containerCount; i++)
                {
                    var view = (View)templates[i].CreateContent();

                    view.GestureRecognizers.Add(new TapGestureRecognizer()
                    {
                        Command = new Command(async(obj) =>
                        {
                            await ExecuteTapGestureRecognizer(view);
                        })
                    });

                    SetBindingContextForView(view, container[i]);
                    AddViewToLayout(view, containerCount, i);
                }
            }
        }
示例#7
0
        private void UpdateData()
        {
            var container = BindingContext as IList;

            if (container == null)
            {
                return;
            }

            var newDesiredColumnCount = 0;

            FlowListView flowListView = null;

            if (_flowListViewRef.TryGetTarget(out flowListView) && flowListView != null)
            {
                _flowColumnTemplate   = flowListView.FlowColumnTemplate;
                newDesiredColumnCount = flowListView.FlowDesiredColumnCount;
                _flowColumnExpand     = flowListView.FlowColumnExpand;
            }

            var flowGroupColumn = BindingContext as FlowGroupColumn;

            if (flowGroupColumn != null)
            {
                newDesiredColumnCount = flowGroupColumn.ColumnCount;
            }

            // Getting view types from templates
            var containerCount             = container.Count;
            IList <DataTemplate> templates = GetDataTemplates(container);
            bool layoutChanged             = RowLayoutChanged(containerCount, templates, newDesiredColumnCount);

            _desiredColumnCount = newDesiredColumnCount;

            if (!layoutChanged)             // REUSE VIEWS
            {
                if (_useGridAsMainRoot)
                {
                    for (int i = 0; i < containerCount; i++)
                    {
                        SetBindingContextForView(_rootLayoutAuto.Children[i], container[i]);
                    }
                }
                else
                {
                    for (int i = 0; i < containerCount; i++)
                    {
                        SetBindingContextForView(_rootLayout.Children[i], container[i]);
                    }
                }
            }
            else             // RECREATE COLUMNS
            {
                _currentColumnTemplates = new List <DataTemplate>(templates);

                if (_useGridAsMainRoot)
                {
                    if (_rootLayoutAuto.Children.Count > 0)
                    {
                        _rootLayoutAuto.Children.Clear();
                    }

                    var colDefs = new ColumnDefinitionCollection();
                    for (int i = 0; i < _desiredColumnCount; i++)
                    {
                        colDefs.Add(new ColumnDefinition()
                        {
                            Width = new GridLength(1d, GridUnitType.Star)
                        });
                    }
                    _rootLayoutAuto.ColumnDefinitions = colDefs;

                    for (int i = 0; i < containerCount; i++)
                    {
                        var view = (View)templates[i].CreateContent();

                        view.GestureRecognizers.Add(new TapGestureRecognizer()
                        {
                            Command = new Command(async(obj) =>
                            {
                                await ExecuteTapGestureRecognizer(view);
                            })
                        });

                        SetBindingContextForView(view, container[i]);
                        if (containerCount == 0 || _desiredColumnCount == 0)
                        {
                            return;
                        }

                        AddViewToLayoutAutoHeightEnabled(view, containerCount, i);
                    }
                }
                else
                {
                    if (_rootLayout.Children.Count > 0)
                    {
                        _rootLayout.Children.Clear();
                    }

                    for (int i = 0; i < containerCount; i++)
                    {
                        var view = (View)templates[i].CreateContent();

                        view.GestureRecognizers.Add(new TapGestureRecognizer()
                        {
                            Command = new Command(async(obj) =>
                            {
                                await ExecuteTapGestureRecognizer(view);
                            })
                        });

                        SetBindingContextForView(view, container[i]);
                        if (containerCount == 0 || _desiredColumnCount == 0)
                        {
                            return;
                        }

                        AddViewToLayoutAutoHeightDisabled(view, containerCount, i);
                    }
                }
            }
        }
		/// <summary>
		/// Override this method to execute an action when the BindingContext changes.
		/// </summary>
		/// <remarks></remarks>
		protected override void OnBindingContextChanged()
		{
			base.OnBindingContextChanged();

			var container = BindingContext as IList;

			if (container == null)
				return;

			FlowListView flowListView = null;
			if (_flowListViewRef.TryGetTarget(out flowListView) && flowListView != null)
			{
				_flowColumnTemplate = flowListView.FlowColumnTemplate;
				_desiredColumnCount = flowListView.DesiredColumnCount;
				_flowColumnExpand = flowListView.FlowColumnExpand;
			}
				
			// Getting view types from templates
			var containerCount = container.Count;
			IList<DataTemplate> templates = GetDataTemplates(container);
			bool layoutChanged = RowLayoutChanged(containerCount, templates);

			if (!layoutChanged) // REUSE VIEWS
			{
				if (_useGridAsMainRoot)
				{
					for (int i = 0; i < containerCount; i++)
					{
						SetBindingContextForView(_rootLayoutAuto.Children[i], container[i]);
					}
				}
				else
				{
					for (int i = 0; i < containerCount; i++)
					{
						SetBindingContextForView(_rootLayout.Children[i], container[i]);
					}
				}
			}
			else // RECREATE COLUMNS
			{
				if (_useGridAsMainRoot)
				{
					if (_rootLayoutAuto.Children.Count > 0)
						_rootLayoutAuto.Children.Clear();
				}
				else
				{
					if (_rootLayout.Children.Count > 0)
						_rootLayout.Children.Clear();
				}

				_currentColumnTemplates = new List<DataTemplate>(templates);

				if (_useGridAsMainRoot)
				{
					if (_rootLayoutAuto.Children.Count > 0)
						_rootLayoutAuto.Children.Clear();

					var colDefs = new ColumnDefinitionCollection();
					for (int i = 0; i < _desiredColumnCount; i++)
					{
						colDefs.Add(new ColumnDefinition() { Width = new GridLength(1d, GridUnitType.Star) });
					}
					_rootLayoutAuto.ColumnDefinitions = colDefs;

					for (int i = 0; i < containerCount; i++)
					{
						var view = (View)templates[i].CreateContent();

						view.GestureRecognizers.Add(new TapGestureRecognizer()
						{
							Command = new Command(async (obj) =>
							{
								await ExecuteTapGestureRecognizer(view);
							})
						});

						SetBindingContextForView(view, container[i]);
						if (containerCount == 0 || _desiredColumnCount == 0)
							return;

						AddViewToLayoutAutoHeightEnabled(view, containerCount, i);
					}
				}
				else
				{
					if (_rootLayout.Children.Count > 0)
						_rootLayout.Children.Clear();

					for (int i = 0; i < containerCount; i++)
					{
						var view = (View)templates[i].CreateContent();

						view.GestureRecognizers.Add(new TapGestureRecognizer()
						{
							Command = new Command(async (obj) =>
							{
								await ExecuteTapGestureRecognizer(view);
							})
						});

						SetBindingContextForView(view, container[i]);
						if (containerCount == 0 || _desiredColumnCount == 0)
							return;

						AddViewToLayoutAutoHeightDisabled(view, containerCount, i);
					}
				}
			}
		}