2016-08-04 17 views
1

In einer UWP-Anwendung (Windows 10) zeige ich eine Liste von Datensätzen in einer ListView an.Wie wird der Fokus in einer TextBox eines ListView-Elements festgelegt?

Wenn ich auf ein Element klicke, wird sein StackPanel angezeigt (mit INotifyPropertyChanged). Im StackPanel gibt es eine TextBox mit einigen Daten, die über die Bindung gefüllt werden.

Ich möchte, dass die TextBox automatisch den Fokus erhält, wenn das StackPanel sichtbar wird, aber ich kann nicht finden, welche Eigenschaft oder Ereignis zu verwenden, und wie Sie eine TextBox.Focus() auslösen.

Vielen Dank für Ihr Feedback!

Die Datatemplate:

<DataTemplate x:Key="templateList"> 
     <StackPanel> 
... 
      <StackPanel Visibility="{Binding IsSelected}"> 
       <TextBox x:Name="textBox" 
         Text="{Binding Title, Mode=TwoWay}"/> 
... 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 
... 

Das Listview:

<ListView x:Name="listView" 
      ItemsSource="{Binding mylist}" 
      ItemTemplate="{StaticResource templateList}"/> 

Antwort

2

kann ich Behaviors für diesen Fall vor. Wie ich bemerkt habe, verwenden Sie Visibility Typ für IsSelected Eigenschaft. Es bedeutet, dass wir DataTriggerBehavior verwenden können, und erstellen unsere SetupFocusAction dem IAction

public class SetupFocusAction : DependencyObject, IAction 
{ 
    public Control TargetObject 
    { 
     get { return (Control)GetValue(TargetObjectProperty); } 
     set { SetValue(TargetObjectProperty, value); } 
    } 

    public static readonly DependencyProperty TargetObjectProperty = 
     DependencyProperty.Register("TargetObject", typeof(Control), typeof(SetupFocusAction), new PropertyMetadata(0)); 

    public object Execute(object sender, object parameter) 
    { 
     return TargetObject?.Focus(FocusState.Programmatic); 
    } 
} 

Danach implementieren wir diese Aktion in XAML verwenden können:

xmlns:i="using:Microsoft.Xaml.Interactivity" 
xmlns:core="using:Microsoft.Xaml.Interactions.Core" 

... 

<StackPanel Visibility="{Binding IsSelected}" 
      Grid.Row="1"> 
    <TextBox x:Name="textBox" 
       Text="{Binding Title, Mode=TwoWay}"> 
     <i:Interaction.Behaviors> 
      <core:DataTriggerBehavior Binding="{Binding IsSelected}" 
             ComparisonCondition="Equal" 
             Value="Visible"> 
       <local:SetupFocusAction TargetObject="{Binding ElementName=textBox}"/> 
      </core:DataTriggerBehavior> 
     </i:Interaction.Behaviors> 
    </TextBox> 
</StackPanel> 

enter image description here

+0

Vielen Dank dafür! Ich habe versucht, aber den folgenden Fehler für den C# -Teil erhalten: CS0246 \t Der Typ oder Namespace-Name 'IAction' konnte nicht gefunden werden (fehlt Ihnen eine Verwendungs-Anweisung oder eine Assembly-Referenz?). Welche Richtlinie sollte ich verwenden? Muss ich eine bestimmte Referenz hinzufügen, um Verhaltensweisen zu verwenden? – Daniel

+0

Sie können Bibliothek hinzufügen über [Nuget] (https://www.nuget.org/packages/Microsoft.Xaml.Behaviors.Uwp.Managed/) –

+0

Ich habe Template10-Bibliothek für mein Projekt installiert, und alles funktioniert wie erwartet! Danke nochmal für deine Hilfe :-) – Daniel