Как обновить ObservableCollection со списком и обновить только измененные значения?

Я создаю приложение с классом Data, где храню все свои данные. В этом классе у меня есть список, заполненный объектами. У меня есть страница с ObservableCollection и ListView. В настоящее время, когда я обновляю ObservableCollection, я очищаю его и пополняю его всеми данными из списка Data-Class. Когда я это делаю, мой ListView мерцает. Я предполагаю, что полное восстановление ObservableCollection вызывает это, в сочетании с пользовательским ViewCell, который не является легким. Как я могу обновлять только то, что хочу? Список / o.collection может иметь разные размеры. В списке / o.collection хранятся один и тот же объект.

То, что я пробовал:

List<csharp.Truck> favs = data.getFavoriteTrucks();
trucks.Clear();
foreach (csharp.Truck truck in favs)
    {
        trucks.Add(truck);
    }
}

Работает, но делает мигание ListView.

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

List<csharp.Truck> all = data.getTrucks();
//if list sizes are not equal(excess/missing objects)
if (all.Count != trucks.Count)
{
    //excess object
    if (all.Count < trucks.Count)
    {
        trucks.Clear();
        foreach(csharp.Truck t in all)
        {
            trucks.Add(t);
        }
    }
    //object missing
    if(all.Count > trucks.Count)
    {
        foreach(csharp.Truck t in all)
        {
            if (!trucks.Contains(t))
            {
                trucks.Add(t);
            }
        }
    }
}//objects are now the same

//test if object is present but outdated(favorite property)
foreach(csharp.Truck t in trucks)
{
    if (t.isFavorite() != all[all.IndexOf(t)].isFavorite())
    {
        t.setFavorite(all[all.IndexOf(t)].isFavorite());
    }
}

Также дайте мне знать, если этот подход не является хорошей практикой в ??первую очередь.

c#,xamarin.forms,

0

Ответов: 1


1

Если вы хотите обновить только некоторые свойства, вы можете реализовать в своем INotifyPropertyChangedинтерфейсе класса модели .

public class Model : INotifyPropertyChanged
{
    private string _myProperty;
    public string MyProperty
    {
        get { return _myProperty; }
        set
        {
            _myProperty = value;
            RaisePropertyChanged();
        }
    }

    #region INotifyPropertyChanged implementation

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName]string propertyName = "")
    {
        Volatile.Read(ref PropertyChanged)?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

И тогда, если это свойство привязано для просмотра, представление будет известно, когда вы его измените:

<Label Text="{Binding MyProperty}" />

c #, xamarin.forms,
Похожие вопросы