Я использовал это решение для RichTextBox, но я предполагаю, что оно также будет работать для стандартного текстового поля. По сути, вам нужно обработать событие LostFocus и пометить его как обработанное.
protected void MyTextBox_LostFocus(object sender, RoutedEventArgs e)
{
// When the RichTextBox loses focus the user can no longer see the selection.
// This is a hack to make the RichTextBox think it did not lose focus.
e.Handled = true;
}
TextBox не поймет, что потерял фокус, и все равно покажет выделенный выбор.
В этом случае я не использую привязку данных, поэтому возможно, что это испортит двустороннюю привязку. Возможно, вам придется принудительно связывать в вашем обработчике событий LostFocus. Как то так:
Binding binding = BindingOperations.GetBinding(this, TextProperty);
if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default ||
binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus)
{
BindingOperations.GetBindingExpression(this, TextProperty).UpdateSource();
}