Привязка данных отстает от уведомления о событии - обсуждение

Обнаружил интересную проблему, которую я впервые обнаружил в WinForms, и снова нашел в Silverlight, и, более чем вероятно, также в WPF, когда дело доходит до привязки данных.

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

Например, пользователь находится в текстовом поле, которое обновляется. Привязка текстовых полей не сбрасывается, пока элемент управления не потеряет фокус. Потеря фокуса происходит, когда курсор перемещается с элемента управления, и фокус передается другому элементу управления.

В этом сценарии пользователь переходит к элементу управления (давайте использовать текстовое поле для этого примера) и обновляет текстовое поле. На этом этапе привязка данных не очистила элемент управления, и, следовательно, виртуальная машина еще не заметила изменения. Затем пользователь использует свою мышь, чтобы щелкнуть следующую вкладку элемента управления.

На этом этапе все становится интересным. Я использовал PreviewSelectionChanged (Telerik RadTabControl), так как я хочу проверить все до того, как произойдет переход на следующую вкладку, и это также дает мне возможность отменить событие.

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

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

Я думаю, что нашел интересный способ решить эту проблему, но я не уверен на 100%, что это сработает в 100% случаев. Я отменяю текущее событие, но затем использую Dispatcher и создаю делегат, указывающий на другой метод с той же подписью, что и текущее событие. Диспетчер добавит это сообщение в насос сообщений, который к этому времени (надеюсь?) Будет находиться за сообщениями об обновлении ВМ ...

Code Snippet delaying the event

У меня два вопроса: Когда мышь использовалась для щелчка по следующей вкладке, текстовое поле должно было потерять фокус, очистить его привязки до предварительного просмотра щелчка на вкладке! Слишком поздно возвращаться и говорить, что мы не успели это вовремя!

Я думаю, что нашел интересный способ решения этой проблемы, но я не уверен на 100%, что это сработает в 100% случаев. Я отменяю текущее событие, но затем использую Dispatcher и создаю делегат, указывающий на другой метод с той же сигнатурой, что и текущее событие. Диспетчер добавит это сообщение в насос сообщений, который к этому времени (надеюсь?) Будет находиться за сообщениями об обновлении ВМ ...

Code Snippet delaying the event

У меня два вопроса: Когда мышь использовалась для щелчка по следующей вкладке, текстовое поле должно было потерять фокус, очистить его привязки до предварительного просмотра щелчка на вкладке! Слишком поздно возвращаться и говорить, что мы не успели это вовремя!

Я думаю, что нашел интересный способ решить эту проблему, но я не уверен на 100%, что это сработает в 100% случаев. Я отменяю текущее событие, но затем использую Dispatcher и создаю делегат, указывающий на другой метод с той же подписью, что и текущее событие. Диспетчер добавит это сообщение в насос сообщений, который к этому времени (надеюсь?) Будет находиться за сообщениями об обновлении ВМ ...

Code Snippet delaying the event

У меня два вопроса:

Я думаю, что нашел интересный способ решения этой проблемы, но я не уверен на 100%, что он будет работать в 100% случаев. Я отменяю текущее событие, но затем использую Dispatcher и создаю делегат, указывающий на другой метод с той же подписью, что и текущее событие. Диспетчер добавит это сообщение в насос сообщений, который к этому времени (надеюсь?) Будет находиться за сообщениями об обновлении ВМ ...

Code Snippet delaying the event

У меня два вопроса:

Я думаю, что нашел интересный способ решения этой проблемы, но я не уверен на 100%, что он будет работать в 100% случаев. Я отменяю текущее событие, но затем использую Dispatcher и создаю делегат, указывающий на другой метод с той же подписью, что и текущее событие. Диспетчер добавит это сообщение в насос сообщений, который к этому времени (надеюсь?) Будет находиться за сообщениями об обновлении ВМ ...

Code Snippet delaying the event

У меня два вопроса: 1) Я предполагаю, что элемент управления текстовым полем либо не сбрасывался, когда мышь покидала элемент управления, либо процесс, который был запущен, был слишком медленным, и, следовательно, сообщение предварительного просмотра было на насосе до привязки данных - в любом случае я вижу это для быть серьезной проблемой.

2) Является ли обходной путь хорошим решением?

5
задан codeputer 28 March 2011 в 23:42
поделиться