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.
UpdatePropertySourceWhenEnterPressed
cambia de un valor válido a un valor válido diferente, se cancela la suscripción y se vuelve a suscribir alPreviewKeyDown
evento innecesariamente. En cambio, todo lo que debe necesitar es verificar si loe.NewValue
esnull
o no. Si no es asínull
, suscríbete; de lo contrario, sinull
, anule la suscripción.