使用Observable Collection和.Remove方法时,Xamarin ListView单元不刷新

时间:2019-04-01 16:18:24

标签: listview data-binding viewmodel observablecollection inotifypropertychanged

我有一个ListView,想要在Android的工具栏中删除它的MenuItem。当用户长按列表中的项目时,垃圾桶图标将显示在右上角。他们点击它,确认删除,然后该项目消失。然后运行一个for循环,该循环旨在以相反的顺序从1到ListView中的项目数重新编号。

我看到的问题是,尽管后面的ObservableCollection(PersonItems)都是正确的,并且我的模型正在实现INotifyPropertyChanged,但屏幕外的某些项目无法更新(标签错误或有时值消失了)。我正在使用ObservableCollection的Remove方法,并且只设置了项目源和ObservableCollection一次。因此,我认为这里没有任何需要更换绑定的问题。

点击显示错误的项目似乎可以正确刷新值。因此,我有信心PersonItems数据会很好。如何确保ListView刷新的每个项目?

这是我的remove和renumber方法的代码:

        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个版本的应用程序需要根据版本显示不同的单元格(我不使用两种类型的单元格的组合,而仅使用一种或另一种)

0 个答案:

没有答案