Si combina las soluciones de Ben y ausadmin, obtendrá una solución muy compatible con MVVM:
<TextBox Text="{Binding Txt1, Mode=TwoWay, UpdateSourceTrigger=Explicit}">
<TextBox.InputBindings>
<KeyBinding Gesture="Enter"
Command="{Binding UpdateTextBoxBindingOnEnterCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}}" />
</TextBox.InputBindings>
</TextBox>
... lo que significa que está pasando el TextBox
propio como parámetro al Command
.
Esto hace que se Command
vea así (si está utilizando una DelegateCommand
implementación de estilo en su VM):
public bool CanExecuteUpdateTextBoxBindingOnEnterCommand(object parameter)
{
return true;
}
public void ExecuteUpdateTextBoxBindingOnEnterCommand(object parameter)
{
TextBox tBox = parameter as TextBox;
if (tBox != null)
{
DependencyProperty prop = TextBox.TextProperty;
BindingExpression binding = BindingOperations.GetBindingExpression(tBox, prop);
if (binding != null)
binding.UpdateSource();
}
}
Esta Command
implementación se puede usar para cualquier TextBox
y, lo mejor de todo, sin código en el código subyacente, aunque es posible que desee ponerlo en su propia clase para que no haya dependencias System.Windows.Controls
en su VM. Depende de cuán estrictas sean las pautas de su código.