MvvmCross中的异步初始化和属性已更改 [英] async Init and Property Changed in MvvmCross

查看:75
本文介绍了MvvmCross中的异步初始化和属性已更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在视图模型中有一些来自Init的异步调用.问题在于,有时异步调用会在OnCreate之前返回,并且UI中的属性不会更新. 当我们必须初始化异步数据时,是否有适合这种情况的异步/等待模型?

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?

伪代码:

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

推荐答案

我可能会在OnCreate方法中执行类似的操作,因为您将来可能希望向其添加其他属性.

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

这篇关于MvvmCross中的异步初始化和属性已更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆