Заполнять ListView при загрузке страницы (Xamarin.Формы) с помощью команды
Я безуспешно пытался заполнить ListView, привязанный к ObservableCollection, когда загружается страница. В настоящее время он работает с кнопкой (привязанной к команде) со следующим кодом.
Вид:
<Button Text="Load Items" Command="{Binding LoadItemsCommand}"></Button>
<ActivityIndicator IsRunning="{Binding IsBusy}" IsVisible="{Binding IsBusy}" />
<ScrollView>
<ListView ItemsSource="{Binding Items}">
.....
</ListView>
</ScrollView>
Вид.cs:
private ItemsViewModel _itemsViewModel;
public ItemsView()
{
InitializeComponent();
_itemsViewModel = new ItemsViewModel();
BindingContext = _itemsViewModel;
}
ViewModel:
public ObservableCollection<Item> Items{ get; set; }
public Command LoadItemsCommand { get; set; }
public ItemsViewModel()
{
Items = new ObservableCollection<Item>();
_isBusy = false;
LoadItemsCommand = new Command(async () => await LoadItems(), () => !IsBusy);
}
public async Task LoadItems()
{
if (!IsBusy)
{
IsBusy = true;
await Task.Delay(3000);
var loadedItems = ItemsService.LoadItemsDirectory();
foreach (var item in loadedItems)
Items.Add(item);
IsBusy = false;
}
}
Это прекрасно работает с кнопкой, но я понятия не имею, как сделать это автоматически. Я попытался привязать свойство RefreshCommand listview к своей команде, но ничего не вышло.
1 ответ:
Есть несколько способов, но лучше всего было бы запустить задачу в конструкторе моделей представления, который загружает данные. Я также не буду добавлять каждый элемент в наблюдаемую коллекцию, поскольку это будет означать обновление пользовательского интерфейса в конце добавления. Было бы лучше полностью заменить коллекцию после загрузки всех данных.
Что-то вроде:
public ItemsViewModel() { Items = new ObservableCollection<Item>(); _isBusy = false; Task.Run(async () => await LoadItems()); } public async Task LoadItems() { var items = new ObservableCollection<Item>(); // new collection if (!IsBusy) { IsBusy = true; await Task.Delay(3000); var loadedItems = ItemsService.LoadItemsDirectory(); foreach (var item in loadedItems) items.Add(item); // items are added to the new collection Items = items; // swap the collection for the new one RaisePropertyChanged(nameof(Items)); // raise a property change in whatever way is right for your VM IsBusy = false; } }