Я думаю, вам лучше справиться с этим иначе.На самом деле вам не нужно связывать текст, так как вы не хотите синхронизировать данные, но обрабатываете ввод, поэтому лучше использовать входные события.
Это может сочетаться с командованием и Blend SDK. Interactivity
, например,
<TextBox Padding="2">
<i:Interaction.Triggers>
<t:KeyDownTrigger Key="Return">
<i:InvokeCommandAction Command="{Binding ProcessCommandCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=TextBox}}" />
</t:KeyDownTrigger>
</i:Interaction.Triggers>
</TextBox>
Где KeyDownTrigger определен так:
public class KeyDownTrigger : TriggerBase<TextBox>
{
public Key Key { get; set; }
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(AssociatedObject_PreviewKeyDown);
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PreviewKeyDown -= AssociatedObject_PreviewKeyDown;
}
void AssociatedObject_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key)
{
InvokeActions(null);
}
}
}
И команда будет выглядеть примерно так:
private readonly Command _ProcessCommandCommand = new Command(p =>
{
var tb = (TextBox)p;
var command = tb.Text;
// <Process command>
tb.Clear();
});
public Command ProcessCommandCommand { get { return _ProcessCommandCommand; } }
(Command
- это то, что люди любят называть RelayCommand
, общая реализация ICommand
, использующая функции, переданные в конструкторе)