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

No comments:
Post a Comment