WPF - интерфейс не обновляется из Command - PullRequest
0 голосов
/ 26 января 2019

У меня проблема с тем, что мой пользовательский интерфейс не обновляется при выполнении команды.

У меня есть неопределенный ProgressBar, видимость которого связана со свойством IsBusyIndicator в ViewModel.Команда теперь должна выполнять метод и показывать ProgressBar во время вычислений, как показано в codenippett ниже.Тем не менее, это не работает, как я ожидал.Для свойства задано правильное значение, но пользовательский интерфейс не обновляется, чтобы отобразить ProgressBar.

Это работает нормально, если я просто устанавливаю IsBusyIndicator в значение true и ничего не делаю в команде, поэтому INotifyPropertyChanged и Bindingработают правильно.

void CommandExecute()
{
    IsBusyIndicator = true;
    // Do stuff that takes long
    IsBusyIndicator = false;
}

Мне кажется, что пользовательский интерфейс ожидает завершения команды, прежде чем он обновляет представление.Есть ли способ заставить пользовательский интерфейс обновлять сразу?

Заранее спасибо, пусть сила будет с вами.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Как уже говорили другие, это не работает, так как вы, вероятно, выполняете свою работу в потоке пользовательского интерфейса.

Вот технические вещи: Когда PropertyChanged из INotifyPropertyChanged повышается, привязка планирует диспетчер, вызывая его в диспетчере с BeginInvoke, а не сразу.

Поскольку поток пользовательского интерфейса все еще выполняет длинную операцию, обработка изменения свойства по-прежнему ожидает в очереди диспетчера. Вот почему изменение происходит только после выполнения команды.

0 голосов
/ 26 января 2019

Вы можете попробовать следующее:

private async void CommandExecute()
{
    IsBusyIndicator = true;
    await Task.Run(() => DoWork());
    IsBusyIndicator = false;
}

Это заставит DoWork() работать в отдельном потоке.Как правило, методов async void следует избегать, но они в порядке, если обрабатывают событие пользовательского интерфейса.

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