async Init and Property Changed in MvvmCross

為{幸葍}努か 提交于 2019-12-12 12:04:45

问题


I have some async calls from Init in view model. The problem is that sometimes async call returns before OnCreate, and the property in UI is not updated. Is there proper async/await model for this case, when we have to init async data?

pseudo code:

    // ViewModel
    public async Task Init(string id)
    {
        Url = await LoadUrlAsync(id);
    }


    // View
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.ui_xml);
        ViewModel.PropertyChanged += ViewModel_PropertyChanged;
    }

    void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        _webView.LoadUrl(ViewModel.Url);
    }

回答1:


I'd probably do something like this in the OnCreate method, as you might want to add additional properties to it in the future.

private bool _loaded;

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.ui_xml);
    ViewModel.WeakSubscribe(() => ViewModel.Url, (s,e) => 
    {
        if (!_loaded)
            _webView.LoadUrl(ViewModel.Url);
    });

    if (ViewModel.Url != null) //Check if the async Init has finished already
    {
        _webView.LoadUrl(ViewModel.Url);
        _loaded = true;
    }
}


来源:https://stackoverflow.com/questions/19408287/async-init-and-property-changed-in-mvvmcross

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!