У меня есть 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 версии приложения, которые должны отображать разные ячейки в зависимости от версии (я не использую комбинацию двух типов ячеек, только один илидругой).