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