Я бы лично использовал наблюдаемую коллекцию для своего источника данных. Существует множество примеров, но по сути ваш код будет выглядеть примерно так. Я не проверял этот код. Если у вас возникли проблемы, добавьте несколько комментариев.
Здесь есть два основных момента. Во-первых, не загружайте никакие данные, если только вы не в режиме разработки (вы можете поместить оператор else, а затем загрузить данные заглушки POCO, если вам нужна поддержка разработки). Во-вторых, вы должны загрузить свои данные в отдельном потоке, а затем в потоке пользовательского интерфейса.
Обновлено
Было несколько обновлений кода. Я изменил (новый поток) на использование QueueUserWorkItem, я изменил метод AddItems, потому что ObservableCollection не поддерживает AddRange, и я изменил написание на IEnumerable
public class TvShowsDataSource
{
public ObservableCollection<Show> Shows { get; set; }
private void AddItems(IEnumerable<Show> shows)
{
foreach(var show in shows)
Shows.Add(show);
}
public void LoadShowsAsync(Dispatcher dispatcher)
{
ThreadPool.QueueUserWorkItem((state) =>
LoadShows(dispatcher));
}
private void LoadShows(Dispatcher dispatcher)
{
if (dispatcher == null)
throw new ArgumentNullException("dispatcher");
using (var context = new Data.TVShowDataContext())
{
var list = from show in context.Shows
select show;
dispatcher.Invoke(AddItems(list));
}
}
}
public class UserControl1
{
private readonly TvShowsDataSource tvShowsDataSource;
public UserControl1() : this(new TvShowsDataSource()) {}
public UserControl1(TvShowsDataSource tvShowsDataSource )
{
InitializeComponent();
this.tvShowsDataSource = tvShowsDataSource;
listShow.ItemsSource = tvShowsDataSource.Shows;
this.Loaded += UserControl1_Loaded;
}
public void UserControl1_Loaded(object sender, RoutedEventArgs e)
{
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
tvShowsDataSource.LoadShowsAsync(this.Dispatcher);
}
}
}