One solution I've used in the past is to update the binding whenever the contents of the text box changes, rather than when focus is lost.
A simple, reusable way to do this is with a behaviour.
Something like this:
public class RebindOnTextChanged : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.TextChanged += this.TextChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.TextChanged -= this.TextChanged;
}
private void TextChanged(object sender, TextChangedEventArgs e)
{
var bindingExpression = this.AssociatedObject.GetBindingExpression(TextBox.TextProperty);
if (bindingExpression != null)
{
bindingExpression.UpdateSource();
}
}
}
and used like:
<TextBox Text="{Binding SomeProperty}">
<i:Interaction.Behaviors>
<behaviours:RebindOnTextChanged />
</i:Interaction.Behaviors>
</TextBox>