Ячейки Xamarin ListView не обновляются при использовании Observable Collection и метода .Remove - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть ListView, для которого я хочу удалить элемент MenuItem на панели инструментов на Android.Когда пользователь долго нажимает на элемент в списке, в правом верхнем углу появляется значок корзины.Они нажимают на него, подтверждают удаление, и элемент исчезает.Затем запускается цикл for, который предназначен для перенумерации элементов от 1 до количества элементов в ListView в обратном порядке.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые элементы вне экрана не обновляются(метки неправильные или иногда значения исчезают), даже несмотря на то, что ObservableCollection (PersonItems) позади все правильно, и моя модель реализует INotifyPropertyChanged.Я использую метод Remove из ObservableCollection, и я устанавливаю источник элемента и ObservableCollection только один раз.Так что я не думаю, что здесь есть какая-либо проблема, связанная с заменой переплетов.

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

Вот код для моих методов удаления и перенумерации:

        private void RemoveItemFromList(string itemId)
        {
            var removingPerson = PersonItems.FirstOrDefault(s => s.Id == itemId);
            var isTopItem = removingPerson == PersonItems.First();
            PersonItems.Remove(removingPerson);
            if (!isTopItem) // No need to renumber if only the top item is removed
            {
                RenumberItems(); 
            }
        }

        private void RenumberItems()
        {
            var indexNumber = 1;

            var itemCount = PersonItems.Count;
            for (int i = 0; i < itemCount; i++)
            {
                PersonItems[i].Number = itemCount - i;
            }
            RaisePropertyChanged(nameof(PersonItems));

            //Here, I have tried the same approach with a foreach, but thought the issue might lie with modifying while using an enumerator. But no dice.
            //var indexNumber = 1;
            //foreach (var person in PersonItems.Reverse())
            //{
            //    person .Number = indexNumber++;
            //    RaisePropertyChanged(nameof(person));
            //}
            //RaisePropertyChanged(nameof(PersonItems));
        }

Вот соответствующие части в моей модели:

    public class Person: INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get => _name;
            set
            {
                _name = value;
                OnPropertyChanged();
            }
        }

        private int _number;
        public int Number
        {
            get => _number;
            set
            {
                _number= value;
                OnPropertyChanged();
                OnPropertyChanged(nameof(Name));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Кроме того, я использую шаблоны данных, так как у меня есть 2 версии приложения, которые должны отображать разные ячейки в зависимости от версии (я не использую комбинацию двух типов ячеек, только один илидругой).

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