Ich habe ein View-Modell mit einem Konstruktor, der einen Service benötigt. Ich benutze GalaSoft MvvmLight, die einen Service-Locator verwendet, um die Ansicht mit dem Ansichtsmodell zu verbinden.MVVM View-Modell und asynchrone Dateninitialisierung
SimpleIOC übernimmt die Bereitstellung des Dienstes für den Viewmodels-Konstruktor, aber ich muss mein Viewmodel irgendwie mit Daten aus einer Datenquelle füllen. Mein Ansichtsmodell sieht wie folgt aus: -
public class MainPageViewModel : ViewModelBase
{
private readonly GroupService _groupService;
private readonly GroupFactory _groupFactory;
private readonly ObservableCollection<GroupVM> _groupVms = new ObservableCollection<GroupVM>();
public MainPageViewModel(Domain.Services.GroupService groupService, VMFactories.GroupFactory groupFactory)
{
_groupService = groupService;
_groupFactory = groupFactory;
}
public async Task Init()
{
var groups = await _groupService.LoadGroups();
foreach (var group in groups)
{
GroupVms.Add(_groupFactory.Create(group));
}
}
public ObservableCollection<GroupVM> GroupVms { get { return _groupVms; } }
}
Irgendwie ist der init-Methode muss ein abgewartet werden genannt, aber ich weiß nicht, wie man am besten, dies zu tun? Ich kann mich drei Möglichkeiten: -
- Ich nenne Init nur auf dem Konstruktor, aber es nicht zu erwarten (ich weiß, das ist wirklich schlechte Praxis)
- Ich nenne Init auf ViewModelLocator Objekt, aber da kann ich nicht zurückgeben eine Aufgabe Ich kann nicht wieder auf die init warten
- Auf die Auslastung der Ansicht ich den DataContext auf eine Art von IAsyncViewmodel und warten auf die Init-Methode.
Ich habe Option 3 in einem früheren Windows 8 Store-Projekt verwendet, aber es fühlt sich einfach falsch an. Jeder Rat würde wirklich geschätzt werden!
Dank
Ross
Guter Punkt, es war mehr "eines dieser Dinge", die ich übernommen hatte, aber nicht wirklich darüber nachgedacht hatte. Hier ein paar mehr Informationen über: http://stackoverflow.com/questions/7261173/c-sharp-start-async-method-within-object-constructor-bad-practice Grundsätzlich ist es, weil, wenn das Objekt konstruiert ist, es immer noch ist. Dinge tun "vielleicht unerwartet, und es ist sehr schwierig, Ausnahmen zu behandeln, die auftreten könnten. Ich habe beide Möglichkeiten ausprobiert, und ich denke, ich bevorzuge die Init im Konstruktor, aber immer noch nicht sicher! –
Tipp: Um die "Squigglies" in Visual Studio zu vermeiden, weisen Sie den Wert des zurückgegebenen Tasks einer Dummy-Variablen zu –