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
            }
        };
    }
}

person user2297037    schedule 15.09.2017    source источник


Ответы (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();
person Cheesebaron    schedule 15.09.2017
comment
Отлично, я успешно использовал вариант 2! - person user2297037; 15.09.2017