Skorzystaj poprawnie z Dispatchera.
Musisz dodać rzeczy do swojego ListBoxa (lub jego źródła danych) z wątku Dispatchera, inaczej interfejs użytkownika eksploduje. Kiedy to zrobisz, jesteś już w metodzie w tym wątku lub (mam nadzieję, że bardziej prawdopodobne) jesteś w wątku w tle i używasz Dispatcher.BeginInvoke
, aby dodać przedmiot.
Po skopiowaniu aktualizacji do programu rozsyłającego należy użyć priorytetu Dispatcherpriority.Normal
. Dyspozytor ma kolejkę elementów do pracy, a twoje przedmioty o wartości Normal
wpychają się (być może zaskakująco) w tę kolejkę.
Bit kodu uruchamiany przez WPF w celu aktualizacji powiązania danych po zmianie danych bazowych na DispatcherPriority.DataBind
, który jest niższy niż Normal
. Oznacza to, że powiązanie danych zwykle nie będzie aktualizowane, dopóki wszystkie pozycje nie zostaną dodane (lub, alternatywnie, jeśli dodawanie elementów zajmie dużo czasu, może się zdarzyć, gdy dyspozytor będzie bezczynny między dodawaniem elementów).
Bit kodu, który faktycznie renderuje formant (powiedzmy, gdy jego powiązanie sygnalizuje aktualizację) działa pod numerem DispatcherPriority.Render
i ma nawet niższy priorytet niż powiązanie. Oznacza to, że kontrola będzie się wyświetlać tylko wtedy, gdy w Dispatcherze zabraknie powiązań do aktualizacji, co z kolei nastąpi tylko wtedy, gdy w Dispatcherze zabraknie pozycji - dodaje do procesu.
Jeśli brzmi to dziwnie, pamiętaj, że każda warstwa (update - binding - render) powoduje ustawienie metaforycznej flagi na poniższej warstwie - nie uzyskasz dziesięciu powiązań, a następnie stanie się dziesięć renderów. Jeśli Twój przedmiot jest szybki, otrzymasz wszystkie dodane elementy, a następnie jedno bindowanie i jeden rendering - co jest idealne.
Zasadniczo: jeśli użyjesz Dispatchera jako zamierzonego, nie będziesz się martwić. Wydaje się "niesłuszne", aby render był relatywnie niskim priorytetem dla Dispatchera, ale w rzeczywistości jest bardzo sprytny :-)
Tak, programowo dodaje elementy do ListBox. Cóż, nie ma zbyt wiele kodu do pokazania, ponieważ nie zakodowałem jeszcze całej aplikacji, po prostu testuję, jak to zrobić, używając Listbox i następującego kodu: dla (int i = 0; i <1000; i ++) { lbQuery.Items.Add (i); } W każdym razie, czy możesz podać przykładowy kod swojego rozwiązania? – Lith
+1, budowanie ich na liście jako pierwsze byłoby znacznie lepsze. O ile nie jest to niemożliwe, będziesz musiał żyć z narzutem przerysowania dla każdego dodatku. –
Jeśli możesz szybko wypełnić całą listę, powinieneś to zrobić przed powiązaniem ... jeśli nie, to nie musisz koniecznie przerysowywać każdego dodania, jeśli możesz dodać partię w czasie lub coś podobnego. –