Ho un modello di visualizzazione con un costruttore che richiede un servizio. Sto usando MvvmLight di GalaSoft che utilizza un localizzatore di servizi per collegare la vista al modello di visualizzazione.MVVM visualizzazione modello e inizializzazione dati asincroni
SimpleIOC gestisce il servizio per il costruttore viewmodels, ma in qualche modo devo compilare il mio viewmodel con i dati di un'origine dati. Il mio ViewModel sembra un così: -
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; } }
}
In qualche modo il metodo init ha bisogno di essere chiamato atteso, ma non so il modo migliore per fare questo? Mi vengono in mente tre opzioni: -
- mi basta chiamare Init sul costruttore, ma non attendere (lo so questo è davvero una cattiva pratica)
- chiamo Init sull'oggetto ViewModelLocator, ma dal momento che non ci riesco restituire un compito Non riesco ancora ad attendere l'init
- Sul carico della vista getto il DataContext su una sorta di IAsyncViewmodel e attendo il metodo init.
Ho usato l'opzione 3 in un precedente progetto di Windows 8 store ma mi sembra sbagliato. Qualche consiglio sarebbe molto apprezzato!
Grazie
Ross
Un buon punto, era più "una di quelle" cose che avevo preso, ma che non avevo davvero pensato. Ecco un po 'più di informazioni su: http://stackoverflow.com/questions/7261173/c-sharp-start-async-method-within-object-constructor-bad-practice Fondamentalmente è perché quando l'oggetto è costruito è ancora " fare cose "forse inaspettatamente, in più è molto difficile gestire le eccezioni che potrebbero verificarsi. Ho provato entrambi i modi, e penso di preferire l'init nel costruttore, ma non sono ancora sicuro! –
suggerimento: per evitare che gli "squigglies" in Visual Studio assegnino il valore dell'attività restituita a una variabile fittizia –