2013-09-18 6 views
-2

На мой взгляд, модель, у меня есть следующие свойства:WPF Binding не обновляется

public Visibility IsModelBusy { get; set; } 

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

private void DoSomething(object obj) 
{ 
    IsModelBusy = Visibility.Visible; 
    OnPropertyChanged("IsModelBusy"); 
    DoHeavyWork(); 
    IsModelBusy = Visibility.Collapsed; 
    OnPropertyChanged("IsModelBusy"); 
} 

У меня есть элемент пользовательского интерфейса, который связан в IsModelBusy:

<Border Visibility="{Binding IsModelBusy, UpdateSourceTrigger=PropertyChanged}"> 
... 
</Border> 

ПРОБЛЕМА Моя граница никогда не становится видимой, а главное окно зависает, пока тяжелая задача продолжается (я не могу запустить это в фоновом потоке) Я пробовал обернуть измененный вызов свойства в действии, переданном диспетчеру, не повезло, проблема по-прежнему сохраняется.

Теперь, если я это сделать:

private void DoSomething(object obj) 
{ 
    IsModelBusy = Visibility.Visible; 
    OnPropertyChanged("IsModelBusy"); 
    MessageBox.Show("What the..."); <========= 
    DoHeavyWork(); 
    IsModelBusy = Visibility.Collapsed; 
    OnPropertyChanged("IsModelBusy"); 
} 

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

ВОПРОС без использования фоновых задач, как я могу заставить пользовательский интерфейс для обработки PropertyChanged события?

+0

Вы пробовали настройки 'Binding Mode' на' Two-Way'? Я считаю, что Visibility по умолчанию «One-Way». –

+2

> Я не могу запустить это в фоновом потоке - не могли бы вы объяснить, почему? – Dennis

+0

Кто звонит DoSomething()? –

ответ

0

После игры вокруг с этим много, я, наконец, нашел ответы на мои вопросы:

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

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

Без использования фоновых задач, как заставить пользовательский интерфейс обрабатывать события PropertyChanged?

Там нет никакого способа обойти это - я держал коробочное решение сообщения, чтобы заставить интерфейс обрабатывать все события

5

Вы блокируете поток пользовательского интерфейса с помощью DoHeavyWork().

Диспетчер не может обрабатывать другие операции (например, обновлять пользовательский интерфейс), поскольку он занят выполнением кода.

Положите это в фоновом режиме.

+0

-1. Это не отвечает на мои вопросы вообще. Я знаю, что «DoHeavyWork» блокирует мой рабочий процесс. Я за то, почему «MessageBox» заставляет пользовательский интерфейс обновляться? – GETah

+0

Не существует технических аргументов о том, что вы не используете потоки - единственная проблема - мои требования. Я не могу использовать многопоточность по требованию - разве это не достаточно ясная причина? – GETah

+0

@ GETah, что это за требование? это экзамен или что-то еще? –

Смежные вопросы