Как установить источник списка, когда асинхронный void закончен? - PullRequest
0 голосов
/ 29 сентября 2018

У меня следующий код.Это работает, однако мне нужно вызвать ListFiles() вручную, иначе ListView не показывать элементы.GetItems() должен выполняться асинхронно, и это проблема.Как изменить этот код для правильной работы?

<UserControl.Resources>
<CollectionViewSource x:Name="GroupsCVS"/>
</UserControl.Resources>

private ObservableCollection<Item> ItemsList;

//get files in directory and list them
public async void GetItems()
{
    IReadOnlyList<StorageFile> files = await selectedFolder.GetFoldersAsync();
    foreach (StorageFile file in files)
    {
        Manager.ItemsList.Add(file);
    }
}

//read list items and display in listview
public void GetFiles()
{
    GroupsCVS.Source = Manager.ItemsList;
}

1 Ответ

0 голосов
/ 01 октября 2018

Клеменс дал правильный ответ: сначала позвоните GetFiles, а затем ждите GetItems.Это означает, что перед вызовом GetFiles метод и Manager.ItemsList были изменены.

И вы также можете прослушать событие ObservableCollection CollectionChanged.Это гарантирует, что GroupsCVS.Source может быть установлено самое последнее значение.Проблема в том, что GetFiles будут вызываться много раз.Лучший способ заключается в том, чтобы вы могли реорганизовать код с помощью подхода Клеменса.

ItemsList.CollectionChanged += ItemsList_CollectionChanged;

private void ItemsList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    GetFiles();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...