Witam
Posiadam TreeView, który jest ładnie podłączony z kolekcją ObservableCollection<MyElement>();
Jeśli dodam coś do tej kolekcji kodem:
MyElement newMyElement= new MyElement()
{
Name = "Nazwa"
};
Folders.Add(newMyElement);
to dodaje natychmiastowo oraz nie zamyka otwartych TreeItemów, ani nie odznacza zaznaczonych. Zachowuje się IDEALNIE.
Problem jest w momencie spięcia z wynikami z bazy.
Tak inicjuje to spięcie:
db = new DbFileContext("plik.baza", true);
var filtered = db.MyElements.Include(p => p.Folders).Where(p => p.ParentId == null);
Folders = new ObservableCollection<MyElement>(filtered);
No i dane się ładują. Problem pojawia się w momencie zinsertowania czegoś do bazy. Automatycznie nic się nie odświeża, a gdy zrobię taką operację:
var filtered = db.MyElements.Include(p => p.Folders).Where(p => p.ParentId == null);
Folders = new ObservableCollection<MyElement>(filtered);
to odświeża TreeView, ale go całego resetuje.
Podejrzewam, ze sytuacja wynika z faktu, że te nowe obiekty które są zwracane przy takim wydaniu zapytania do bazy mimo że są w większości takie same, w sensie obiektu są nowe. Wystarczyłoby napisać jakiś synchronizator. Na zasadzie:
- Co nowe to dodaj
- Czego nie ma to usuń
- Co zmodyfikowane zmodyfikuj pole po polu
- Skanuj listę dzieci i zrób powyższe operacje poczynając od pierworodnego potomka skończywszy na najmłodszym dziecku
Jednak czy M$ nie oferuje jakiegoś gotowca? Aż mi się wierzyć nie chce.
Pozdrawiam