Setting focus to a control in WPF using MVVM
Asked Answered
F

1

8

I want keyboard focus to be set to a TextBox when I click a Button on my view. I don't want to use any codebehind, so wondered if anyone had written an attached property or similar solution?

F answered 14/1, 2011 at 17:35 Comment(0)
T
5

Try this out:

public static class FocusBehavior
{
    public static readonly DependencyProperty ClickKeyboardFocusTargetProperty =
        DependencyProperty.RegisterAttached("ClickKeyboardFocusTarget", typeof(IInputElement), typeof(FocusBehavior),
        new PropertyMetadata(OnClickKeyboardFocusTargetChanged));

    public static IInputElement GetClickKeyboardFocusTarget(DependencyObject obj)
    {
        return (IInputElement)obj.GetValue(ClickKeyboardFocusTargetProperty);
    }

    public static void SetClickKeyboardFocusTarget(DependencyObject obj, IInputElement value)
    {
        obj.SetValue(ClickKeyboardFocusTargetProperty, value);
    }

    private static void OnClickKeyboardFocusTargetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var button = sender as ButtonBase;
        if (button == null)
            return;

        if (e.OldValue == null && e.NewValue != null)
            button.Click += OnButtonClick;
        else if (e.OldValue != null && e.NewValue == null)
            button.Click -= OnButtonClick;
    }

    private static void OnButtonClick(object sender, RoutedEventArgs e)
    {
        var target = GetKeyboardClickFocusTarget((ButtonBase)sender);

        Keyboard.Focus(target);
    }
}

Then to use it,

<TextBox x:Name="TargetTextBox"/>
<Button b:FocusBehavior.ClickKeyboardFocusTarget="{Binding ElementName=TargetTextBox}"/>
Thunderstone answered 14/1, 2011 at 20:23 Comment(2)
Thanks, that's given me a head start!F
This example is working fine. However, there is small change in the following method. You have to call the GetClickKeyboardFocusTarget method instead of GetKeyboardClickFocusTarget: private static void OnButtonClick(object sender, RoutedEventArgs e) { var target = GetKeyboardClickFocusTarget((ButtonBase)sender); Keyboard.Focus(target); }Cyclothymia

© 2022 - 2024 — McMap. All rights reserved.