Set focus on TextBox in WPF from view model

后端 未结 21 2522
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-22 06:21

I have a TextBox and a Button in my view.

Now I am checking a condition upon button click and if the condition turns out to be false, displ

21条回答
  •  故里飘歌
    2020-11-22 06:57

    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 =
              DependencyProperty.RegisterAttached(
                  "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:

      
      

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

    Cheers.

提交回复
热议问题