2017-08-04 42 views
-1

我正在使用Xamarin.Forms並且想要調用異步方法將數據加載到視圖模型中。在哪裏應該將數據加載到ViewModel中

我應該如何將數據(異步)加載到視圖模型中?

我試圖在構造函數中做,但我不能在構造函數中調用異步方法。

這是我的代碼:

public List<IdeaResource> IdeasList; 
public IdeasViewModel() 
{ 
    HypermediaClient client = new HypermediaClient(); 
    IdeasList = await client.GetIdeasAsync(); 
} 
+0

請更具體一些。通過等待任務加載異步數據...就像任何其他時間異步獲取函數的返回值 – BradleyDotNET

+0

沒有最佳實踐,只是上下文中的良好實踐。 – EJoshuaS

回答

1

雖然肯定不是最好的做法有一個變通。創建一個事件並從構造函數中調用該事件。

解決方法是事件處理程序可以是異步並調用事件不會阻止UI線程。

public class IdeasViewModel : ViewModelBase { 
    public List<IdeaResource> IdeasList; 
    public IdeasViewModel() { 
     Initialized += OnInitialized; 
     Initialized(this, EventArgs.Empty); 
    } 

    private event EventHandler Initialized = delegate { }; 

    private async void OnInitialized(object sender, EventArgs e) { 
     //unsubscribing from the event 
     Initialized += OnInitialized; 
     //call async 
     var client = new HypermediaClient(); 
     IdeasList = await client.GetIdeasAsync(); 
    } 
} 

在理想情況下的數據負載的功能應該是在一個公衆可獲得的方法

public async Task LoadDataAsync() { 
    var client = new HypermediaClient(); 
    IdeasList = await client.GetIdeasAsync(); 
} 

和稱爲在視圖的事件處理程序。

public class IdeasPage : ContentPage { 
    private IdeasViewModel viewModel; 

    public IdeasPage() { 
     //...assign variables 
    } 

    protected override void OnAppearing() { 
     this.Appearing += Page_Appearing; 
    } 

    private async void Page_Appearing(object sender, EventArgs e) { 
     //...call async code here 
     await viewModel.LoadDataAsync(); 

     //unsubscribing from the event 
     this.Appearing -= Page_Appearing; 
    } 
} 
相關問題