Мне бы очень понравилось какое-то событие, такое как 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.
Я допускаюне знать влияние изменений источника привязки извне привязки.Но у меня есть полноценное редакторное настольное приложение, которое таким образом обнаруживает изменения пользователя, и оно работает очень хорошо.