Игнорирование изменений текста / значения из-за привязки данных - PullRequest
5 голосов
/ 20 октября 2011

Как игнорировать изменения в элементе управления, когда происходит привязка данных? Я пытался перехватить различные события, такие как gotfocus, textoted и leftfocus, но если элемент управления уже имеет фокус и пользователь «отменяет» их изменения, когда я перезагружаю запись и вступает в силу привязка данных, textaged думает, что пользователь все еще внес изменение, так как фокус на этом контроле. Стек вызовов пуст. Существуют ли какие-либо глобальные события привязки данных, такие как начало привязки данных и окончание привязки данных? Я вижу, где я запускаю свой OnProperyChanged, но в рамках этого вызова привязка данных не происходит. Похоже, он «встает в очередь» и работает в какой-то другой точке.

В какой-то момент я собирался перехватить события изменения свойств в нашей модели представления, но это означает, что я не буду обнаруживать и не могу ВИЗУАЛЬНО отображать изменение формы до тех пор, пока пользователь не покинет элемент управления. Я знаю, я знаю, что я могу изменить все свои привязки, чтобы привязка возникала сразу при каждом изменении символа, но это мешает некоторым случаям проверки, поскольку пользователь еще не закончил вводить их значение.

Мне бы очень понравилось какое-то событие, такое как TextChangedByUser, которое будет запускать независимо от того, использовал ли пользователь клавишу, буфер обмена, буфер обмена мыши, что-нибудь, что запускается пользователем.

Я просто не могу понять, как различать изменения пользователя и изменения привязки данных.

Ответы [ 3 ]

6 голосов
/ 05 декабря 2011

Мне бы очень понравилось какое-то событие, такое как TextChangedByUser, которое бы запускало, использовал ли пользователь клавишу, буфер обмена, буфер обмена мыши, что-нибудь, что было вызвано пользователем.

Я просто не могу понятьузнать, как различать изменения пользователя и изменения привязки данных.

Не использовать событие Text.TextChanged для обнаружения ввода пользователя,вместо этого используйте событие Binding.SourceUpdated.

Или более общее: не используйте DP ваших визуальных элементов для обнаружения пользовательских обновлений, вместо этого используйте событие Binding.SourceUpdated.

ЭтоRoutedEvent.В вашем обязательном порядке, вы должны установить NotifyOnSourceUpdated = true.С помощью UpdateSourceTrigger вы даже можете настроить, когда хотите получать информацию.

Ваш xaml может выглядеть следующим образом:

<Grid x:Name="LayoutRoot" Binding.SourceUpdated="LayoutRoot_SourceUpdated">
    ...
    <TextBox>
        <TextBox.Text>
            <Binding NotifyOnSourceUpdated="True" Path="path" UpdateSourceTrigger="PropertyChanged" >
            </Binding>
        </TextBox.Text>
</Grid>

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

private void LayoutRoot_SourceUpdated(object sender, DataTransferEventArgs e)
{
    // called every time s.th. changed by user
}

(отредактировано из-за комментариев)Почему это правильный способ определить, был ли ввод каким-либо образом инициирован пользователем?В данном примере свойство DataContext TextBox 'path' является source , а свойство TextBox.Text - target .[Обзор привязки данных] http://msdn.microsoft.com/en-us/library/ms752347.aspx
Свойство TextBox.Text изменяется впервые, когда привязка инициализируется и значение источника записывается в свойство TextBox.Text.Поскольку вы не знаете, когда именно происходит привязка, вы не можете использовать свойство TextBox.Text или любое из его событий (например, TextChanged) для обнаружения ввода пользователя.Следовательно: не используйте событие Text.TextChanged для обнаружения ввода пользователя !!!более общий: не используйте DP ваших визуальных элементов для обнаружения пользовательских обновлений !!!

Если пользователь изменяет содержимое визуального текстового поля с помощью чего бы то ни было, свойство TextBox.Text изменяется(ваша target ). После этого привязка обновляет source в момент времени, определенный UpdateSourceTrigger. Это когда происходит событие SourceUpdated.

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

0 голосов
/ 21 октября 2011

Вы можете использовать событие UIElement.TextInput для обнаружения ввода пользователя.

Обратите внимание, что событие, вероятно, уже обработано самим элементом управления вводом, поэтому вам, возможно, придется использовать событие UIElement.PreviewTextInput .

0 голосов
/ 21 октября 2011

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

{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

РЕДАКТИРОВАТЬ : Извините, я наблюдал за тем, что вы уже знаете это ... В этом случае, я не могу помочь: (

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