que han resuelto este momento estableciendo explícitamente el foco a algún otro elemento antes de pedir los valores. Obviamente, esto hace que el elemento que actualmente tiene el foco lo pierda y actualice el enlace.
Para establecer el enfoque, he escrito una propiedad adjunta, inspirada en las respuestas a otras preguntas. Además, junto con my other question hice esto algo automatizado.
Así que para usarlo, básicamente adjuntar mi propiedad a un elemento, en este caso un control de ficha:
<TabControl c:Util.ShouldFocus="{Binding ShouldClearFocus}">
En mi modelo de vista, tengo una sencilla propiedad booleana ShouldClearFocus
que es una elevación propiedad estándar a PropertyChangedEvent
, por lo que el enlace de datos funciona. Luego, simplemente configuro ShouldClearFocus
en true
cuando quiero restablecer el enfoque. La propiedad adjunta establece automáticamente el foco y restablece el valor de la propiedad nuevamente. De esa manera puedo seguir configurando ShouldClearFocus
sin tener que configurarlo en false
en el medio.
La propiedad adjunta es una implementación estándar con esto como su manejador cambio:
public static void ShouldFocusChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(bool)e.NewValue || !(obj is FrameworkElement))
return;
FrameworkElement element = (FrameworkElement)obj;
if (element.Focusable)
element.Focus();
// reset value
BindingExpression bindingExpression = BindingOperations.GetBindingExpression(obj, ShouldFocusProperty);
if (bindingExpression != null)
{
PropertyInfo property = bindingExpression.DataItem.GetType().GetProperty(bindingExpression.ParentBinding.Path.Path);
if (property != null)
property.SetValue(bindingExpression.DataItem, false, null);
}
else
SetShouldFocus(obj, false);
}
De lejos, la solución más flexible/elegante propuesta en este foro. Funcionó muy bien - gracias – BCA