MVVMLight i DataService

0

Korzystam z MVVM Light i w modelu wczytuję i tworzę obiekt listy <Entity> i w modelu trzymam to w property. Następnie w ViewModelu za pomocą DataService pobieram ta listę i przypisuję do property ( z INotifyPropertyChanged ) w ViewModelu.
Dane się przepisują i View korzysta z nich. Jednak tylko wtedy gdy lista w modelu jest wypełniona przed wywołaniem ViewModelu. W momencie gdy uruchamiam program i widok jest widoczny a w tle powoli wypełnia się list<Entity>, DataService dostaje się do listy i przechwytuje tylko tyle danych ile jest wpisanych. Jak zmusić DataService, żeby przy zmianie danych w list<Entity> pobierało ono dane do ViewModelu.
Wykorzystać Messengera z MVVM Light?

W pracy nie mogę dostać się do mojego repo więc kod wkleję po powrocie do domu.

0

A może problem tkwi w List<Entity>. Próbowałeś konwersji listy na ObservableCollection<Entity>. Ta kolekcja sama w sobie implementuje INotifyPropertyChanged wiec każda zmiana danych powinna mieć odzwierciedlenie w View...

0

Nie jestem pewny czy zrozumiałem pytanie - chodzi ci o to, że przy zwykłym dodawaniu np. obiektu (przez .Add) do listy nie widać zmian w widoku? Jeśli tak to potrzebujesz do tego ObservableCollection. (ewentualnie kolekcji implementującej INotifyCollectionChanged)

0

Wyjaśniam, bo faktycznie nie jasno zapytałem. List<Entity> w ViewModelu wykorzystuje obserwowalną kolekcję z MVVMLight ( korzysta z ObservableCollection lub INotify.. z czego dokładnie nie wiem ) jednak problem mam inny. Model uzupełnia swoje property a DataService pobiera te property tylko raz ( aczkolwiek widzę w oknie output, że 2 razy pod rząd ). I chcę aby DataService cały czas pobierało dane w chwili zmiany prop w Modelu.

Kurcze, widzę że bez kodu jednak się nie obejdzie a ni jak nie mogę dostać się do kodu w pracy.

0

pseudokod :

 public static class myModel
{
public dane<Entity> {get;set;}
}

ViewModelLocator tworzy ViewModel i wstrzykuje mu referencje do Modelu

 public class ViewModel
{
public Source<Entity> {get;set;} 
// to property implementuje ObservableCollection lub INotify.... nie wiem, bo korzystam z prop z MVVMLight. W setterze wstawiłem Debug.WriteLine i tylko raz się odpala. Przypuszczam, że w chwili wywołania konstruktora.

public ViewModel(IDataService, dataService)
{
_dataService = dataService;
_dataService.GetData(
                (items) =>
                {
                    Source = items;
                });
// w chwili gdy model jest wypełniony i ta metoda się odpali wszystko jest ok, ale gdy model się wypełnia i ten konstruktor się odpali, oczywiście pobiera callback tylko to co jest w Modelu. Chcę aby callback odpalał się zawsze po zmianie danych w Modelu.
}
}
}

edit: po namyśle i pomęczeniu wujka google zastosuje messengera z MVVM Light. W Modelu zarejestruje się w messengerze i za każdym razem gdy model dada dane, wywołam messengera. Natomiast ViewModel po zarejestrowaniu się w messengerze to będzie powiadamiany o każdej zmianie w modelu i dokona przypisania listy do Source. Tym samym Model ciągle będzie oddzielony od ViewModelu.

0

Nie wiem czy do końca dobrze rozumiem ale ja to widze tak ze podmieniasz cała kolekcje, są więc na to dwa sposoby albo robisz .Clear() i ładujesz od nowa dane poprzez .Add() ( metoda zalecana przez MS ), lub po podpięciu do ObservableCollection nowej kolekcji wywołujesz na niej OnPropertyChanged czy co kolwiek tam używasz do za komunikowania widokowi że wartość się zmieniła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1