Установка флага IsBusy вокруг загрузки объекта данных - PullRequest
1 голос
/ 17 ноября 2011

У нас есть относительно большой класс модели данных DataModel, который связан с различными элементами управления пользовательского интерфейса.Мы хотим, чтобы индикатор занятости из WPF Toolkit Extended отображался во время загрузки экземпляра модели данных.

Пример кода приведен ниже.Индикатор занятости отображается во время выполнения функции LoadReport, но исчезает после оператора assign, в то время как операции привязки все еще обрабатываются, т.е. до того, как интерфейс будет «готов».Есть ли что-нибудь, что мы можем сделать, чтобы ждать этого?

// Show we are busy.
this.Dispatcher.Invoke(DispatcherPriority.Send, (Action)delegate()
{
    this.BusyMessage = "Loading report...";
    this.IsBusy = true;
});

var instance = this.LoadReport();
this.DataModel = instance;

// Show we are no longer busy.
this.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate()
{
    this.BusyMessage = null;
    this.IsBusy = false;
});


<toolkit:BusyIndicator IsBusy="{Binding ThisScreen.IsBusy}" BusyContent="{Binding ThisScreen.BusyMessage, TargetNullValue='Please wait...'}" >
    <Grid x:Name="ScreenGrid" />
</toolkit:BusyIndicator>

Это не похоже на необычную проблему, но мне не повезло в поисках решения ... Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Возможно, вы можете попробовать установить BusyMessage & IsBusy inline, а не вызывать с помощью Dispatcher.

this.DataModel = instance;  

// set these directly
this.BusyMessage = null;     
this.IsBusy = false;

Это должно уведомить пользовательский интерфейс о том, что вы не заняты в то же время , когда происходит привязка DataModel - все произойдет сразу.

Использование Dispatcher - это что-то вроде отправки уведомления прямо в поток пользовательского интерфейса. Ваш статус занятости становится «не связанным» с другими привязками и изменениями пользовательского интерфейса, которые вы внесли.

0 голосов
/ 17 ноября 2011

Я бы сказал, что это ожидаемое поведение.

Вы устанавливаете BusyMessage в null и IsBusy в false сразу после того, как метод LoadReport() завершен. Это не дает времени для обновления остального пользовательского интерфейса.

Лучшим решением может быть поднять событие LoadComplete и поставить

// Show we are no longer busy.
this.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate()
{
    this.BusyMessage = null;
    this.IsBusy = false;
});

в обработчике для этого:

Это даст остальным время привязки для обновления - хотя нет гарантии, что они сработают первыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...