Which event should be used to update a Model from TextBox (LostFocus, LostKeyboardFocus, etc) in WPF? How to set precedence of events in WPF?

StackOverflow https://stackoverflow.com/questions/4447645

Question

I have an application in which there are lot of TextBoxes and some Buttons like Save, SaveAs,etc.

When the user edits a TextBox, I have to check the DataBase for some range, validate the range and update the DataBase. If there is any error in value entered by user,then I should not allow the TextBox to lose focus.

I was using LostFocus event for this and it was working fine until lately I discovered a bug in my application.

Bug : The user edits a value in TextBox and then clicks on Save button; the LostFocus event is not called and so Database is not getting updated :(

Now my question is which event should I use in TextBox to update the DataBase. I tried TextChanged event but it validates for every character and making my application slow. I am confused in chosing the right event for this kind of application!

Note :** The Buttons are in different UserControl !

EDIT 1 : I have some Commands attached to click of Buttons, these Commands are getting executed before LostFocus !! Can I set precedence or something like attached behaviours or commands should get executed after LostFocus !!

EDIT 2 : I was just debugging the application by disabling some commands, what I found was in some cases, the DelegateCommand gets executed before LostFocus, so I want to avoid that. How can I go about it ? I felt during development its impossible to developa pure MVVM application so I am kind of using a bit of codebehind !

Was it helpful?

Solution

Trapping the keyboard focus within a control is usually a sign of bad UI design - it's pretty user-hostile to force the user to fix data in a control before he can type anywhere else in the UI.

That said, you shouldn't be using events at all here. You're trying to write a Windows Forms application in WPF. You should write a WPF application.

Create a class that is a logical model of your view - i.e., there's a string property for the text box and a Command property (or, more likely, a RelayCommand) for the Save button. Bind the text box to the string property, e.g.:

<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Because the UpdateSourceTrigger is PropertyChanged, the source object will get updated every time the user types a character.

Bind the button to the command property, e.g.:

<Button CommandBinding="{Binding SaveCommand}">Save</Button>

Implement the appropriate CanSave and Save methods that the RelayCommand (as described in Josh Smith's essential article on the MVVM pattern) requires, so that the button is enabled when the string property is valid and disabled when it's not.

OTHER TIPS

I think the best approach is preventing a user to proceed until all valid information has been gathered.

Just like an installation wizard with Terms & Conditions Dialog and Next button. Until you check the I Agree checkbox, Next button is disabled.

This way, you don't have to worry about user proceeding without providing valid information. This way, you can use any event on TextBox to validate your data.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top