Piszą swój cykl postów o WPF a w szczególności wpis, o DataBindingu pominąłem jeden ciekawy rodzaj bindingu o którym chciałbym dziś wspomnieć.
Załóżmy, że mamy UI, który wyświetla jakieś elementy, które pobierane są z WebService’u. Oczywiście strzał do WebService’u (® by Marcin Najder) jest kosztowny jeśli chodzi o czas a UI nie chcemy blokować. Możemy wykorzystać w tym celu PriorityBinding. Jak?
Załóżmy, że nasza klasa dostępu do danych wygląda następująco:
Mamy zatem 3 źródła różniące się szybkością dostępu. Instant nie zawiera żadnych aktualnych danych, cache ma przechowywane lokalnie dane, które oczywiście mogą być nie do końca prawidłowe, natomiast WebService zwraca nam najnowsze dane. Jak napisać binding, aby nasz UI aktualizował się w miarę jak będziemy otrzymywać dane tj. aby od razu wypisał to co zwróci Instant a później gdy otrzyma dane z Cache lub z WebService zaktualizował się automatycznie? <PriorityBinding.
Oczywiście zakładając, że DataContext jest ustawiony na naszą klasę DataAccess. Jak to zadziała? Kolejność wpisów ustala priorytet. Im wyżej tym ważniejsze i prawdopodobnie bardziej czasochłonne wykonanie funkcji. Im niżej tym powinno ono być mniej ważne i szybsze. Dzięki ustawieniu parametru IsAsync na true, wywołania czasochłonne nie zostaną wywołane w wątku UI, blokując go jednocześnie a w wątku BackgroundWorker’a.
Efekt finalny…
Nice 🙂
Miłego kodowania!
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl