Обновление списка после асинхронного метода - PullRequest
0 голосов
/ 28 октября 2019

У меня есть ObservableCollection, который содержит элементы для ListView.

ObservableCollection<MyListItem> Items { get; set; }

Во время создания элемента путь к изображению извлекается из кэша.

public class MyListItem {
    public string Image { get; set; }
    public MyListItem(string url) {
    ...
        setImage(url);
    }

    private async void setImage(string url) {
        Image = await MyCachingLib.GetUrlAsync(url);
    }
}

Однако,если изображение еще не в кеше, мы скачиваем его из интернета. Это занимает слишком много времени, и пользовательский интерфейс, кажется, уже обновляется к моменту установки изображения.

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

Я проверял, чтобыубедитесь, что это не моя библиотека кеширования:

private async void setTitle(string title) {
   await Task.Delay(2000); //pretend to get data from the web
   Title = title;
}

... И заголовок не обновляется с задержкой.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Сделайте ваше MyListItem орудие INotifyPropertyChanged. При таком подходе изменения будут распространяться на пользовательский интерфейс.

public class MyListItem : BaseModel
{
    private string image;
    public string Image
    {
        get => image;
        set
        {
            image = value;
            OnPropertyChanged(nameof(Image));
        }
    }

    public MyListItem(string url)
    {
        ...
        setImage(url);
    }


    private async void setImage(string url)
    {
        Image = await MyCachingLib.GetUrlAsync(url);
    }
}

public abstract class BaseModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        changed?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Я сделал это с помощью BaseModel, но вы можете свободно поместить INotifyImplementation в вашу модель.

В вашемФайл Xaml / UI, просто привязать к изображению. Должно работать; -)

0 голосов
/ 28 октября 2019

Другой способ - сделать ваш класс производным от BindableObject, чтобы вы могли сделать это:

public class MyListItem : BindableObject {
    public string Image { get; set; }
    public MyListItem(string url) {
    ...
        setImage(url);
    }

    private async void setImage(string url) {
        Image = await MyCachingLib.GetUrlAsync(url);
        OnPropertyChanged(nameof(Image));
    }
}

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

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