Если вы попытаетесь сфокусировать элемент внутри его собственного обработчика LostFocus, вы столкнетесь с StackOverflowException, я не уверен насчет основной причины (я подозреваю, что фокус фокусируется вокруг), но есть простой обходной путь: отправьте его.
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
var element = (sender as TextBox);
if (!theTextBoxWasValidated())
{
// doing this would cause a StackOverflowException
// element.Focus();
var restoreFocus = (System.Threading.ThreadStart)delegate { element.Focus(); };
Dispatcher.BeginInvoke(restoreFocus);
}
}
Посредством Dispatcher.BeginInvoke вы гарантируете, что восстановление фокуса не мешает происходящей потере фокуса (и избегаете неприятного исключения, с которым вы столкнетесь в противном случае)