2017-08-04 4 views
-1

Ich verwende Xamarin.Forms und möchte eine asynchrone Methode zum Laden von Daten in das Ansichtsmodell aufrufen.Wo sollten Daten in das ViewModel geladen werden

Wie soll ich Daten (asynchron) in das Ansichtsmodell laden?

Ich habe versucht, es im Konstruktor zu tun, aber ich kann nicht Async-Methode im Konstruktor aufrufen.

dies ist mein Code:

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

Bitte seien Sie genauer. Sie laden asynchrone Daten, indem Sie auf eine Aufgabe warten ... genau wie zu jeder anderen Zeit erhalten Sie asynchron einen Rückgabewert einer Funktion – BradleyDotNET

+0

Es gibt keine Best Practices, nur gute Praktiken im Zusammenhang. – EJoshuaS

Antwort

1

Während definitiv nicht eine bewährte Methode eine Arbeit um die es gibt. Erstellen Sie ein Ereignis und rufen Sie das Ereignis über den Konstruktor auf.

Die Umgehung ist, dass der Ereignishandler async sein kann und das Aufrufen des Ereignisses den UI-Thread nicht blockieren wird.

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

Idealerweise sollte die Datenladefunktionalität in einer öffentlich zugänglichen Methode

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

und in einem Event-Handler in der Ansicht aufgerufen.

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