2013-10-16 51 views
4

我有一些來自Init視圖模型的異步調用。問題是,有時異步調用會在OnCreate之前返回,並且UI中的屬性不會更新。 當我們需要初始化異步數據時,這種情況是否有適當的異步/等待模型?async Init和Property Changed in MvvmCross

僞代碼:

// 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

你的代碼看起來應該可以工作。首先要檢查的是'Url' setter實際上正在提升'PropertyChanged'。你也可以找到我的[異步初始化博客文章](http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html)。 –

+2

因爲你顯示的所有內容都是在UI線程上同步的,所以''Async'調用可以在調用'ViewModel.PropertyChanged + = ViewModel_PropertyChanged;'之前返回的唯一方法就是如果'async'調用同步執行 - 所以你可以只需在你的'OnCreate'方法中檢查 - 'if(ViewModel.Url'= null)...' – Stuart

回答

2

我可能會做這樣的事情在OnCreate方法,因爲你可能要附加屬性在將來添加到它。

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