Вот что я сделал в недавнем проекте.
Свойство IsBusy - это то, что у меня есть в базовом классе для всех моих моделей представления.Это логическое значение, к которому может привязываться представление, если оно хочет отобразить какой-то ожидающий элемент управления, например спиннер или что-то подобное.
Поле _retrieveData - это просто действие, которое я настроил во время создания модели представления.Я делаю это, потому что viewmodel может получить свой список Cars несколькими различными способами - поэтому в _retrieveData может быть разный код в зависимости от используемого конструктора.После того, как _retrieveData получит данные, он установит личный покровитель, _cars с данными.Поэтому после завершения _retrieveData установка общедоступных Cars в значение с новыми данными в _cars вызывает PropertyChangedEvent, который позволяет представлению обновляться.
Таким образом, эффект заключается в том, что когда представление переходит для получения данныхв первый раз он сразу возвращается, но становится нулевым.Затем, через несколько секунд, он получает реальные данные.В течение этого времени пользовательский интерфейс реагирует.И также, IsBusy верен, если пользовательский интерфейс хочет сообщить пользователю, что он работает в фоновом режиме.
Не уверен, что это хороший способ справиться с этим, но пока он работает для меня.
public List<Car> Cars
{
get
{
if (this._cars == null)
{
base.IsBusy = true;
// Start a background thread to get the data...
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object nullObject)
{
this._retrieveData.Invoke();
this.Cars = this._cars;
base.IsBusy = false;
}));
// While waiting on the background thread, return null for now. When the background thread
// completes, the setter will raise OnPropertyChanged and the view will know its time to bind...
return this._cars;
}
return this._cars;
}
set
{
this._cars = value;
base.OnPropertyChanged("Cars");
}
}