Mam model widoku z konstruktorem, który wymaga usługi. Używam MvvmLight firmy GalaSoft, która wykorzystuje lokalizator usług do połączenia widoku z modelem widoku.Model widoku MVVM i inicjalizacja danych asynchronicznych
Uchwyty SimpleIOC zapewniające usługę konstruktorowi viewmodels są w porządku, ale muszę jakoś wypełnić mój obiekt viewmodel danymi ze źródła danych. Moje ViewModel wygląda tak: -
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; } }
}
Jakoś musi metoda init nazwać oczekiwany, ale nie wiem, w jaki sposób najlepiej to zrobić? Mogę myśleć o trzech opcji: -
- po prostu zadzwonić Init na konstruktora, ale nie czeka go (wiem, to jest to naprawdę złe praktyki)
- Wzywam Init na obiekcie ViewModelLocator, ale ponieważ nie mogę Zwróć zadanie, którego znowu nie mogę oczekiwać. Przy ładowaniu widoku rzuciłem DataContext na pewien rodzaj IAsyncViewmodel i czekam na metodę init.
Użyłem opcji 3 w poprzednim projekcie sklepu Windows 8, ale to po prostu źle się dzieje. Każda rada byłaby naprawdę doceniona!
Dzięki
Ross
Dobra uwaga, była to "jedna z tych" rzeczy, które wziąłem, ale nie do końca się nad tym zastanawiałem. Tutaj jest trochę więcej informacji na temat: http://stackoverflow.com/questions/7261173/c-sharp-start-async-method-within-object-constructor-bad-practice Zasadniczo dzieje się tak, ponieważ gdy obiekt jest skonstruowany, wciąż jest " robienie rzeczy "być może nieoczekiwanie, a także bardzo trudno poradzić sobie z wyjątkami, które mogą wystąpić. Próbowałem obu sposobów i myślę, że wolę init w konstruktorze, ale nadal nie jestem pewien! –
wskazówka: aby uniknąć "przeskoków" w Visual Studio wystarczy przypisać wartość zwróconego zadania do zmiennej typu dummy –