2013-05-01 20 views
9

ive pracuje nad tym od kilku dni, ale cant wydają się pochodzić z roztworemUtrzymywanie ostrości/SelectedItem po zmianie DataGrid ItemsSource

mam kodu na zegar, który odświeża DataGrid co kilka sekund

próbowałem wiele opcji odświeżania, ale w końcu wszyscy użytkownicy tracą ostrość, a czasami również SelectedItem

herezje mój kod:

 AddHandler bw.RunWorkerCompleted, Function(sender As Object, e As ComponentModel.RunWorkerCompletedEventArgs) 
               Dim lst = e.Result 
               Dim lst2 = CType(lst, List(Of Object)).OfType(Of INotifyPropertyChanged)() 
               'If Items.Count = 0 Then 
               Dim a = SelectedItem 
               Collection.Clear() 
               Collection.AddRange(lst2) 
               SelectedItem = a 
               'ItemsSource = lst 
               'End If 
               'For Each rw In lst 
               ' Dim mtch = Collection.Where(Function(x) x.GetHashCode = rw.GetHashCode) 

               'Next 

opuściłem komentarzy, dzięki czemu można zobaczyć różne sposoby próbowałem

wyniki:

gdybym bezpośrednio ustawić ItemsSource z wyniku (jak w komentarzu), to keep SelectedItem i Keyboard.FocusedElement stały aż do końca powyższego kodu, ale gdzieś między końcem tego kodu i następnego kleszcza są zarówno przekształcone Nothing

jeśli pójdę z ObservableCollection następnie SelectedItem traci tak szybko, jak wyczyścić i kolekcji Keyboard.FocusedElement jest zagubiony tylko między kleszczami. choć SelectedItem można zachować tutaj ze zmienną podkładowej temp

więc chodzi o to, w jaki sposób odświeżyć pozycji z db zachowując (najbardziej istotne) ostrość klawiatury

i tak, wiem, że ObservableCollections nie są "wykonane" do zresetowania. tak naprawdę nie jestem zainteresowany jej użyciem. ma on tylko jedną zaletę utrzymywania wartości SelectedItem Próbowałem też podłączyć do kilku zdarzeń (OnItemsSourceChanged, SourceUpdated ...), ale nie zostały one zwolnione w odpowiednim czasie, lub nie strzelał w ogóle

żadnych pomysłów?

id naprawdę najbardziej doceniają

dziękuję

+0

sprawdź to - http://stackoverflow.com/questions/12808479/updating-listbox-without-losing-selected-item-wpf – user1221765

+1

dzięki, po nikt tu nie odpowiedział, zrobiłem post w msdn i dostałem całkiem niezły odpowiedź, na razie działa dobrze. link, który ustawiłeś, nie ma żadnych wiadomości, rozważałbym również aktualizację rekordów 1 przez 1., ale jeszcze do tego nie doszło. i tak dziękuję za zainteresowanie! –

+0

Witaj Yisman, czy możesz opublikować link, w którym widzę rozwiązanie. to pomoże mi także się uczyć. dzięki :) – user1221765

Odpowiedz

0

Najlepszym rozwiązaniem jest następujący:

Gdy użytkownik dokonuje wyboru, z wyjątkiem indeksu lub bieżącego selectedItem w zmiennej.

w CollectionChanged nawet w swojej kolekcji ponownie przypisz wybrany element do tego, co wcześniej zapisałeś w zmiennej. Zdarzenie CollectionChanged jest wyzwalane po każdej zmianie w kolekcji, aby można było przeprowadzić przetwarzanie końcowe, które w tym przypadku powoduje ponowne przypisanie wybranego elementu.

0

Czy zweryfikowałeś, że masz instancję taką samą instancję? To znaczy. SelectedItem musi istnieć w lst2. W przeciwnym razie musisz znaleźć pasujący element na nowej liście i użyć tego obiektu.

+0

cześć. w końcu skończyłem tylko zmieniając właściwości tych rekordów, które zostały faktycznie zmienione w db. to wystarczyło. dzięki i tak. –

1

Należy użyć SelectedIndex zamiast właściwości SelectedItem obiektu DataGrid. Zapisz wybrany indeks przed zamianą ItemsSource na lst.

Powód, dla którego SelectedItem nie działa, jest to odniesienie do obiektu na liście, którą zastępujesz.

Być może nie chcesz używać indeksu, ponieważ element skupiony może poruszać się w górę lub w dół w oparciu o aktualizację bazy danych. W takim przypadku musisz użyć klucza, aby znaleźć indeks rekordu na nowej liście.

Jeśli nie możesz użyć indeksu lub nie masz klucza, nie mogę wymyślić dobrego sposobu na zrobienie tego.

Wydaje mi się również, że zastąpienie całej listy doprowadzi do innych problemów. Jeśli użytkownik wpisuje coś w komórce DataGrid i zastępuje listę pod nimi, tracą one swoje modyfikacje.

+0

thnaks. na koniec zbudowałem "ObservableCOllection". która staje się źródłem przedmiotów, a następnie aktualizuję poszczególne właściwości w zakresie obserwowalnym i wszystko jest w porządku. dzięki! –