2017-12-07 1 views
0

In einem WPF-Fenster versuche ich den Cursor standardmäßig auf einen der Textfelder zu setzen. Nach ein paar Fragen und Antworten zu lesen, habe ich versucht, die folgenden:wpf MVVM Fokus-Cursor auf Textbox

XAML:

<StackPanel Grid.Row="1" 
    <StackPanel.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding UserShouldEditValueNow}" Value="true"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=FID}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StackPanel.Style> 
    <TextBox Name ="FID" Text="{Binding FixID, UpdateSourceTrigger=PropertyChanged}" 
    FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/> 
</StackPanel> 

cs: (Ansichtsmodell)

this.UserShouldEditValueNow = true; 

Ich erwartete einen blinkenden Cursor auf das Textfeld FID zu sehen beim Öffnen des Fensters. Allerdings gibt es in diesem Textfeld überhaupt keinen Cursor. Das Debugging hat mir gezeigt, dass ich den cs-Code durchführe und den Wert auf true setze. irgendwelche ideen warum?

+0

Versuchen Sie [diese] (https://stackoverflow.com/a/1356781/6869276) Ansatz für eine Antwort. Fügen Sie die 'FocusExtension' Klasse, entfernen Sie den Stackpanel und gehen mit diesem: ' ' Arbeiten für mich. – pixela

+0

Mögliches Duplikat von [Setzen Sie den Fokus auf das Textfeld in WPF vom Ansichtsmodell (C#)] (https://stackoverflow.com/questions/1356045/set-focus-on-textbox-in-wpf-from-view-model-c) – techvice

Antwort

0

Lösung beinhaltet: 1. Hinzufügen einer FocusExtension-Klasse. 2. Fokus und Tastatur.Fokus sind innen Dispatcher.BeginInvoke

cs.

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.Dispatcher.BeginInvoke(
        new Action(
         delegate{ 
          uie.Focus(); 
          Keyboard.Focus(uie); 
         } 
        ) 
       ); 
      } 
     } 
    } 

.xaml

 <TextBox Text="{Binding FixID, UpdateSourceTrigger=PropertyChanged}" viewModels:FocusExtension.IsFocused="{Binding UserShouldEditValueNow}" />