2017-08-04 2 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; 
    } 
} 
関連する問題