ListItems в MvxListView связываются непоследовательно с элементами в MvvmCross 6.4.1 после обновления - PullRequest
1 голос
/ 02 ноября 2019

Как видно из заголовка, я нахожусь в процессе обновления зависимостей существующего проекта Xamarin.Android. Проект Android использует MvvmCross для большей части кроссплатформенного кода (мы поддерживаем и другие платформы). В рамках этого обновления мы переходим с MvvmCross 6.2.2 на 6.4.1. В настоящее время мы создаем приложение с помощью Visual Studio 2019.

Однако после обновления я заметил, что многие макеты моего проекта более не связаны так согласованно, как при работе. Для многих наших представлений об Android мы используем MvxListView, чтобы отобразить список ячеек формы для ввода пользователем ввода. В Mvx 6.2.2, созданной с помощью Visual Studio 2017, списки отображаются правильно. Однако при сборке с Visual Studio 2019 и Mvx 6.4.1 некоторые элементы оказались связанными, а другие - нет. Я исключил Mvx 6.4.1 в качестве причины, потому что я пытался скомпилировать наше приложение без изменений с VS 2017 и 2019 и все еще получил непоследовательную привязку к VS 2019.

Если у вас, ребята, есть какие-либопредложения о том, что исправить, я хотел бы услышать это!

Некоторые свойства Android Build:

Options 1 Options 2

Чтобы проиллюстрировать, что я подразумеваю под непостоянным связыванием:

Согласованное связывание: Consistent Binding

Значительное связывание: Inconsistent Binding Некоторыефрагменты кода для подкласса MvxAdapter, который мы используем для визуализации отдельных строк:

private View _locationView;
        protected override View GetBindableView(View convertView, object source, ViewGroup parent, int templateId)
        {
            var item = source as ICellModel;
            if (item != null)
            {
                templateId = GetTemplateIdForCellType(item.CellType);
                templateId = GetStateCellForKey(item, templateId);
            }

            try
            {
                if (item != null && item.CellType != CellType.MapSelector)
                {
                    var bindableView = base.GetBindableView(convertView, source, parent, templateId);
                    return bindableView;
                }
                if (_locationView != null)
                {
                    return _locationView;
                }

                _locationView = base.GetBindableView(convertView, source, parent, templateId);
                return _locationView;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return null;
            }

        }

private int GetTemplateIdForCellType(CellType cellType)
        {
            // Example code to show picking a custom templace
            switch (cellType)
            {
                case CellType.X
                    return Resource.Layout.XCell;
                case CellType.Y:
                    return Resource.Layout.YCell;
                case CellType.Z:
                    return Resource.Layout.ZCell;
            }
            return -1;
        }

        private static int GetStateCellForKey(ICellModel cellModel, int templateId)
        {
            var singleLineEditCellsToBeDisplayCells = new List<int>
                {
                    .// Types for single line edit cells
                };
            var multiplineEditCellsToBeDisplayCells = new List<int>
            {
                // types for multi-line edit cells
            };
            if (cellModel.FormState == FormState.Display)
            {
                if (singleLineEditCellsToBeDisplayCells.Any(c => c.Equals(templateId)))
                    return Resource.Layout.SingleLineDisplayFormCell;
                else if (multiplineEditCellsToBeDisplayCells.Any(c => c.Equals(templateId)))
                    return Resource.Layout.MultiLineDisplayFormCell;
            }

            var selectorCellModel = cellModel as SelectorCellModel;
            if (selectorCellModel != null && selectorCellModel.IsMultiline)
            {
                return Resource.Layout.MultiLineSelectorCell;
            }


            //Multi line

            //Map cell
            return templateId;
        }

    }
...