Alles was Du in Ereignisbehandlungsroutinen implementierst, findet auch im UI-Thread statt. Das Laden der Daten blockiert dadurch, dass die Ereignisbehandlungsroutine ausgeführt wird, die Aktualisierung der UI.
Du implementierst WPF, da ist CodeBehind immer schlecht. Schau Dir mal das MVVM-Pattern an. Unabhängig davon wirst Du das Daten der Laden asynchron ausgestalten müssen. Auch hier gibt es verschiedenste Entwurfsmuster, angefangen von Kanonen wie ReactiveExtensions über die Task Parallels Library, die Verwendung von Threads oder oder oder.
Aktualisierungen aus anderen Threads heraus, die auf die UI zugreifen, müssen mit dieser wieder synchronisiert werden (Dispatcher.Invoke).
Mit Hilfe von Google sollten Dir die aufgeführten Ansätze einiges an Lesestoff und Problemlösungen bieten können.