Xamarin-FreshMVVM Init不能以异步方式工作

时间:2017-09-15 11:47:42

标签: c# xamarin async-await freshmvvm

它是一个Xamarin应用程序,我试图在 FreshMVVM 中实现的 Init 中调用异步方法,但似乎不起作用。

当我加载页面时,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 个答案:

答案 0 :(得分:3)

由于您要延迟提供给ListView所需数据的人口和初始化,您需要:

  1. 在您的ViewModel上实施INotifyPropertyChanged并在您创建List媒体资源时触发它。
  2. 让您的List成为ObservableCollection,并在ViewModel的构造函数中对其进行实例化,然后在以后填充它。
  3. 你也可以混合两者。

    所以选项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();