WPF, как ждать обновления связывания перед обработкой большего количества кода?

Насколько я понимаю, диспетчер находится в другом потоке, который занимается обновлением привязок данных, макета и т. Д. Однако есть ли способ подождать, пока у диспетчера не будет больше элементов или, по крайней мере, больше нет привязок данных? Я хочу убедиться, что изменение свойства обновило все его компоненты и запустить зависимые обратные вызовы измененного свойства, прежде чем запускать больше кода.

редактировать: так что я предполагаю, что это не нужно, я просто пытаюсь понять, что я должен был сделать вместо этого. Мой главный вопрос в WPF: если размер дочерних элементов средства просмотра прокрутки изменяется, будет ли программа прокрутки автоматически обновлять свой экстент?

но мне также было любопытно, могу ли я ждать обновления привязок или есть ли какая-либо гарантия, что одна привязка обновится раньше другой? Должен ли я кодировать так, чтобы порядок обязательных обновлений не имел значения? в настоящее время я использовал измененные обратные вызовы свойств зависимостей, которые выполняют различные действия, которые часто зависят от обновления других свойств

1 ответ

Диспетчер имеет несколько приоритетов для обработки отдельных задач. Я совершенно уверен, что вы не можете изменить приоритет обратных вызовов свойств зависимостей. Если они были изменены связыванием данных, они будут в очереди с приоритетом DispatcherPriority.DataBinding. Вы манипулируете значениями некоторых свойств зависимостей, которые могут привести к изменению макета / других свойств зависимостей. И вы хотите подождать после вашей первой манипуляции, пока эти обновления / изменения макета не будут обработаны, а затем что-то делать с текущим состоянием интерфейса?

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

public static void DoEvents()
{
  if (Application.Current == null)
    return;
  Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, (Delegate) (() => {}));
}

Пустой делегат вызывается синхронно, это означает, что вызов возвращается после того, как делегат был выполнен диспетчером. DispatcherPriority.Background имеет очень низкий приоритет, так что этот вызов диспетчера обрабатывается после, например, привязок данных, обновлений макета или рендеринга. http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx

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

Другие вопросы по тегам