Set focus on TextBox in WPF from view model

Let me answer to your question in three parts.

  1. I’m wondering what is “cs.txtCompanyID” in your example? Is it a TextBox control? If yes, then you are on a wrong way. Generally speaking it’s not a good idea to have any reference to UI in your ViewModel. You can ask “Why?” but this is another question to post on Stackoverflow :).

  2. The best way to track down issues with Focus is… debugging .Net source code. No kidding. It saved me a lot of time many times. To enable .net source code debugging refer to Shawn Bruke’s blog.

  3. Finally, general approach that I use to set focus from ViewModel is Attached Properties. I wrote very simple attached property, which can be set on any UIElement. And it can be bound to ViewModel’s property “IsFocused” for example. Here it is:

    public static class FocusExtension
        public static bool GetIsFocused(DependencyObject obj)
            return (bool) obj.GetValue(IsFocusedProperty);
        public static void SetIsFocused(DependencyObject obj, bool value)
            obj.SetValue(IsFocusedProperty, value);
        public static readonly DependencyProperty IsFocusedProperty =
                "IsFocused", typeof (bool), typeof (FocusExtension),
                new UIPropertyMetadata(false, OnIsFocusedPropertyChanged));
        private static void OnIsFocusedPropertyChanged(
            DependencyObject d, 
            DependencyPropertyChangedEventArgs e)
            var uie = (UIElement) d;
            if ((bool) e.NewValue)
                uie.Focus(); // Don't care about false values.

    Now in your View (in XAML) you can bind this property to your ViewModel:

    <TextBox local:FocusExtension.IsFocused="{Binding IsUserNameFocused}" />

Hope this helps :). If it doesn’t refer to the answer #2.


Leave a Comment