Если вы объедините решения Бена и ausadmin, вы получите очень дружественное решение 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>
... что означает, что вы сами передаете TextBox
в качестве параметра Command
.
Это приводит к тому, что ваш Command
выглядит следующим образом (если вы используете реализацию DelegateCommand
в вашей виртуальной машине):
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();
}
}
Эту реализацию Command
можно использовать для любого TextBox
и, что лучше всего, без кода в программном коде, хотя вы можете захотеть поместить его в свой собственный класс, чтобы не было зависимостей от System.Windows.Controls
в вашей виртуальной машине. , Это зависит от того, насколько строгие правила вашего кода.