Cancelling a WPF TextBox Changed Event


Question

I'm in the process of learning WPF coming from WinForms development.

I have a TextChanged event assigned to one of my TextBox's in my WPF application. If the user enters invalid data, I want to be able to revert to the previous text value.

In the old forms day, I would replace NewValue with OldValue, but it seems WPF doesn't work the same way.

Any ideas on what I could do it achieve this? Am I just not thinking with WPF yet?

Thanks.

1
4
12/2/2008 7:27:11 PM

Accepted Answer

You can do this two ways:

  1. Listen to the PreviewTextInput event and set e.Handled = true to stop the TextChanged event.

  2. Use WPF validation. There is a great post by Paul Stovell on Codeproject and a recent post on his blog.

Those articles will get you started. one thing that got stuck with when I first did validation is that the validation rule only runs when the binding updates the source.

22
12/12/2017 5:58:56 AM

I would use PreviewTextInput, most events in WPF have a Preview sibling. If you set the e.Handled = true it will stop the event from bubbelig/tunneling further.

I'm not sure if you are aware of it but Preview events are said to be tunneling, ie. they start from the outermost container and is posted in every container until it reaches the control that has focus. The non-preview events are said to be bubbeling, ie. they start at the control with focus, and is posted to every parent control.

If you set e.Handled = true on the outermost grid's PreviewTextChanged event, you cancel all other events including the TextChanged as well. First all Preview events get fired from the outermost to the control with focus, then all non-preview events get fired from the control with focus and out to the outermost parent control.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon