Что-то отсутствует в поведении ListView в формах Xamarin - PullRequest
0 голосов
/ 27 июня 2018

Не знаю, чего мне не хватает в 4-й строке. У меня есть ListView на странице, и я хочу установить поведение при изменении размера.

public class ListViewAutoSizeBehavior : Behavior<ListView>
    {
        ListView _ListView;
        //Error here. ITemplatedItemsView<TItem>
        ITemplatedItemsView Cells => _ListView;

        private readonly int _extraPaddingPerRow;

        public ListViewAutoSizeBehavior()
        {
            switch (Device.RuntimePlatform)
            {
                default:
                    _extraPaddingPerRow = 2;
                    break;
                case Device.Android:
                    _extraPaddingPerRow = 6;
                    break;
                case Device.iOS:
                    _extraPaddingPerRow = 4;
                    break;
                case Device.WinPhone:
                    _extraPaddingPerRow = 2;
                    break;
            }
        }

        protected override void OnAttachedTo(ListView bindable)
        {
            bindable.ItemAppearing += AppearanceChanged;
            bindable.ItemDisappearing += AppearanceChanged;
            _ListView = bindable;
        }

        protected override void OnDetachingFrom(ListView bindable)
        {
            bindable.ItemAppearing -= AppearanceChanged;
            bindable.ItemDisappearing -= AppearanceChanged;
            _ListView = null;
        }

        private void AppearanceChanged(object sender, ItemVisibilityEventArgs e)
        {
            UpdateHeight(e.Item);
        }

        private void UpdateHeight(object item)
        {
            if (_ListView == null || _ListView.ItemsSource == null) return;

            int itemsCount = _ListView.ItemsSource.Cast<object>().Count();

            if (_ListView.HasUnevenRows)
            {
                double height;
                if ((height = _ListView.HeightRequest) == (double)VisualElement.HeightRequestProperty.DefaultValue)
                {
                    height = 0;
                }

                height += MeasureRowHeight(item);
                SetHeight((height + _extraPaddingPerRow) * itemsCount + _extraPaddingPerRow);
            }
            else if (_ListView.RowHeight == (int)ListView.RowHeightProperty.DefaultValue)
            {
                var height = MeasureRowHeight(item);
                _ListView.RowHeight = (height + _extraPaddingPerRow);
                SetHeight((height + _extraPaddingPerRow) * itemsCount + _extraPaddingPerRow);
            }
        }

        private int MeasureRowHeight(object item)
        {
            var template = _ListView.ItemTemplate;
            var cell = (Cell)template.CreateContent();
            cell.BindingContext = item;

            var height = cell.RenderHeight;
            var mod = height % 1;

            if (mod > 0)
            {
                height = height - mod + 1;
            }

            return (int)height;
        }

        private void SetHeight(double height)
        {
            //TODO if header or footer is string etc.
            if (_ListView.Header is VisualElement header)
            {
                height += header.Height;
            }

            if (_ListView.Footer is VisualElement footer)
            {
                height += footer.Height;
            }

            _ListView.HeightRequest = height;
        }
    }

Кто-нибудь может подсказать, что мне здесь не хватает? Похоже, мне нужно установить имя класса? или имя какого-то элемента управления.

Пожалуйста, предложите.

1 Ответ

0 голосов
/ 28 июня 2018

Ваша проблема, скорее всего, связана с соглашениями об именах.

Listview - зарезервированное ключевое слово, и _Listview должен сбивать с толку компилятор.

Попробуйте переименовать эту переменную и реорганизовать свой код, чтобы не было никаких проблем.

 ListView _myListView;
 ITemplatedItemsView Cells => _myListView;

Вы не допустили ошибок, поэтому я предполагаю, что это основная причина. Если нет, отправьте сообщение об ошибке для дальнейшего анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...