2014-04-08 91 views
1

我想熟悉Windows應用商店應用程序和MVVM模式(我是這個平臺的新手)。我有一個非常簡單的應用程序,它從json文件中解析Person對象列表,然後在GridView中顯示它們。我創建了一個PeopleViewModel類來充當我的主頁的視圖模型,它處理解析,並公開視圖的對象數組。解析方法:MVVM viewmodel異步數據初始化

public async Task init() 
{ 
    StorageFolder resourceFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; 
    resourceFolder = await resourceFolder.GetFolderAsync("Resources"); 

    StorageFile resourceFile = await resourceFolder.GetFileAsync("persons.json"); 
    string fileContent = await Windows.Storage.FileIO.ReadTextAsync(resourceFile); 

    ObservableCollection<Person> persons = new ObservableCollection<Person>(); 

    JsonValue json = JsonValue.Parse(fileContent); 
    int personCount = json.GetArray().Count; 
    for (int i = 0; i < personCount; i++) 
    { 
     IJsonValue element = json.GetArray()[i]; 
     Person p = new Person(element); 
     persons.Add(p); 
    } 

    _persons = persons; 
} 

然後在我的XAML,我設置類作爲頁面的數據上下文:

<!-- viewModel namespace defined above --> 
<Page.DataContext> 
    <viewModel:PeopleViewModel/> 
</Page.DataContext> 

由於讀取文件是一個異步操作,我不能把它在PeopleViewModel的默認構造函數,我必須調用其init()從我的XAML的代碼隱藏文件的方法:

private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e) 
{ 
    PeopleViewModel viewModel = this.DataContext as PeopleViewModel; 
    await viewModel.init(); 
} 

我的代碼工作很好,但我不知道如果這是正確的方式去做吧。有沒有辦法用異步方法初始化我的視圖模型,並保持我的代碼隱藏文件「乾淨」(或者這個解決方案被認爲是乾淨的)?

回答

2

確實有,只需從構造函數調用async void方法(不需要await),該方法現在可以調用方法await。 (是的,最好的做法是保持代碼隱藏乾淨。)

編輯:

所以根據您的經驗,我離開了一部分說你真的不應該這樣做。相反,建立事件通知你的視圖模型加載的東西。基本上你只能使用async void和事件處理程序。更多內容請見本頁底部:http://caraulean.com/blog/2013/07/15/using-caliburn-micro-with-async-await/(儘管我更喜歡MVVMlight或PRISM--後者甚至給你提供了INavigationAware界面,你可以在其中獲得OnNavigatedTo事件。)

+1

你不應該寫async void method沒有預防措施,並且不應該在屬性/構造函數內部進行異步調用,而沒有明確的副作用解釋。 –

+0

夠公平的,我會修改我的評論:) –

+0

太棒了,我刪除了我的downvote。 –