Xamarin-FreshMVVM Init не работает асинхронно

Это приложение Xamarin, и я пытаюсь вызвать асинхронный метод внутри Init, реализованного в FreshMVVM, но, похоже, не работает.

Когда я загружаю страницу, ListView пуст, хотя привязки верны. На самом деле, если я удаляю вызовы await с некоторыми константами int, ListView отображается правильно.

public class MainPageModel : BasePageModel
{
    private IService _service;
    public List<ModeMenuItem> List { get; set; }

    public MainPageModel(IService Service)
    {
        _service = Service;
    }

    public override async void Init(object initData)
    {
        base.Init(initData);

        List = new List<ModeMenuItem>()
        {
            new ModeMenuItem()
            {
                Name ="Test 1",
                Image ="\uE7EE",
                ViewModelType =null,
                TotalRequests = await _service.Count()
            },
            new ModeMenuItem()
            {
                Name ="Test 2",
                Image ="\uE913",
                ViewModelType =null,
                TotalRequests =await _service.Count()
            },
            new ModeMenuItem()
            {
                Name ="Test 3",
                Image ="\uE8CF",
                ViewModelType =null
            }
        };
    }
}

1 ответ

Решение

Поскольку вы задерживаете заполнение и инициализацию своих данных, вы предоставляете ListView вам нужно либо:

  1. Воплощать в жизнь INotifyPropertyChanged на вашей ViewModel и запустить его при создании List имущество.
  2. Сделай свой List ObservableCollection и создать его экземпляр в конструкторе ViewModel, а затем просто заполнить его в более поздний момент времени.

Вы также можете смешать два.

Таким образом, вариант 1. будет просто вызвать событие PropertyChanged:

private List<ModeMenuItem> _list;
public List<ModeMenuItem> List 
{ 
    get => _list; 
    set
    {
        _list = value;
        RaisePropertyChanged();
    }
}

Вариант 2. будет:

public ObservableCollection<ModeMenuItem> List { get; } 
    = new ObservableCollection<ModeMenuItem>();

а затем заполнить его, не обновляя новую коллекцию:

List.Add();
Другие вопросы по тегам