Como posso fazer com que um controle perca o foco se o usuário clicar em algo que não é focado?
Pergunta
Eu tenho um itemsControl cheio de dezenas de itens; Cada item é uma caixa de texto vinculada e alguns botões. Como eu quero que o usuário possa guiar da caixa de texto para a caixa de texto, os botões têm foco definido como false. Isso funciona muito bem. O único problema é que, como as caixas de texto não estão perdendo o foco, sua ligação não está atualizando a fonte, portanto o código atrás dos botões não está funcionando com os valores certos.
Eu posso pensar em uma maneira de corrigir isso, por exemplo, com o manipulador de cliques para os botões navegar pela árvore lógica até a caixa de texto associada e a criação está vinculando a atualização da fonte explicitamente. Mas parece -me que deve haver uma maneira melhor do que isso, o que provavelmente seria óbvio para mim se eu tivesse uma melhor compreensão do modelo de foco. Existe?
Solução
Como o desempenho é um problema, você pode encontrar um artigo escrito por Josh Smith útil. O contexto é muito semelhante ao seu problema. Josh resolve -o desencadeando a atualização de ligação manualmente:
TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
if (focusedTextBox == null)
return;
BindingExpression textBindingExpr =
focusedTextBox.GetBindingExpression(TextBox.TextProperty);
if (textBindingExpr == null)
return;
textBindingExpr.UpdateSource();
Outras dicas
Se o desempenho permitir, você pode alterar o UpdateSourceTrigger
desses elementos da caixa de texto para PropertyChanged
ao invés de LostFocus
.