Behavior to force TextBox model update to prevent trouble with the ApplicationBar
A small quicky this time:
Problem:
- TextBox, Text property bound to a string in my ViewModel
- I type text in the TextBox
- I click a “Save” button on my ApplicationBar
- The string in my ViewModel is not updated. It never gets updated. WTF???
It appears the TextBox only updates it’s value to a bound string when it loses focus. And a TextBox does not lose focus when you click an ApplicationBar Button. Meh.
I have found a few solutions and workarounds, and in the end rolled my own: a very small behavior that updates the binding every time you type something in your textbox. That’s a bit wasteful, but it works for me. It builds on the SafeBehavior pattern I wrote about earlier, and it’s so small I post it in one go:
using System.Windows.Controls; namespace Wp7nl.Behaviors { /// <summary> /// A behavior to for text box model update when text changes /// </summary> public class TextBoxChangeModelUpdateBehavior : SafeBehavior<TextBox> { protected override void OnSetup() { AssociatedObject.TextChanged += AssociatedObjectTextChanged; } protected override void OnCleanup() { AssociatedObject.TextChanged -= AssociatedObjectTextChanged; } void AssociatedObjectTextChanged(object sender, TextChangedEventArgs e) { var binding = AssociatedObject.GetBindingExpression(TextBox.TextProperty); if (binding != null) { binding.UpdateSource(); } } } }
I have read amongst other things Prism has a UpdateTextBindingOnPropertyChanged behavior. Well this one will be in the next version of my #wp7nl library on codeplex