Обнаружил интересную проблему, которую я впервые обнаружил в WinForms и снова нашел в Silverlight, а также, скорее всего, WPF, когда дело касается привязки данных.
У меня есть элемент управления вкладками с несколькими вкладками.Когда пользователи нажимают на вкладки, каждый раз должно быть допустимо, прежде чем пользователь сможет переключиться с вкладки.
Например, пользователь находится в текстовом поле, которое обновляется.Привязка текстовых полей не очищается, пока элемент управления не потеряет фокус.Потеря фокуса происходит, когда курсор перемещается из элемента управления, а фокус передается другому элементу управления.
В этом сценарии пользователь вкладывает элемент управления (давайте используем текстовое поле для этого примера) и обновляеттекстовое окно.На этом этапе привязка данных не сбросила управление, и, следовательно, виртуальная машина еще не видела изменения.Затем пользователь использует свою мышь, чтобы щелкнуть следующую вкладку элемента управления.
На этом этапе все становится интересным.Я использовал PreviewSelectionChanged (Telerik RadTabControl), так как я хочу проверить вещи до того, как произойдет переход к следующей вкладке, и это также дает мне возможность отменить событие.
Однако, когда я смотрю на виртуальную машину, в этом случае у нее все еще нет обновленных данных.Я вижу, что виртуальная машина чиста, и я могу перейти к следующей вкладке.
Как только это событие закончится, привязки данных сбрасываются, и виртуальная машина обновляется.что теперь?События не синхронизированы!При использовании мыши для перехода на следующую вкладку текстовое поле должно было потерять фокус, очиститься от привязок до того, как нажмете «Предварительный просмотр вкладки»!Уже поздно отскочить назад и сказать, что мы не успели вовремя!
Мне кажется, я нашел интересную работу по этому вопросу - но я не уверен на 100%, что это сработает на 100%.время.Я отменяю текущее событие, но затем использую Dispatcher и создаю делегат, указывающий на другой метод с той же сигнатурой, что и у текущего события.Диспетчер добавит это сообщение в рассылку сообщений, которая к этому времени (надеюсь?) Будет за сообщениями об обновлении виртуальной машины ...
![Code Snippet delaying the event](https://i.stack.imgur.com/5WY2g.jpg)
Мои два вопросаявляются следующими: 1) Я предполагаю, что элемент управления textbox либо не сбрасывался, когда мышь покидала элемент управления, либо запущенный процесс был слишком медленным, и, следовательно, сообщение предварительного просмотра было на насосе до привязки данных - в любом случае, я вижуэто будет серьезной проблемой.
2) Является ли обходной путь хорошим решением?