2011-11-27 4 views
1

Je suis un peu nouveau sur WPF et XAML. J'ai créé un Listbox avec des éléments de zone de texte et je voulais que la zone de texte de l'élément sélectionné soit mise en évidence chaque fois que cet élément est sélectionné. Mon ami m'a suggéré d'utiliser ItemContainer, et j'ai essayé d'utiliser un déclencheur avec une propriété setter de TextBox.IsFocused, mais j'ai continué à obtenir une erreur IsFocused ne peut pas être définie.Définir le focus sur une zone de texte sous une liste DataTemplate

Qu'est-ce qui n'a pas fonctionné? Ci-dessous mon code:

Mise à jour le XAML:

<DataTemplate x:Key="Template"> 
      <Grid Margin="3"> 
       <Border BorderThickness="2" BorderBrush="Black" 
          Background="{Binding RelativeSource= 
          { 
          RelativeSource 
          Mode=FindAncestor, 
          AncestorType={x:Type ListBoxItem} 
          }, 
          Path=Background 
         }" CornerRadius="4"> 
        <StackPanel HorizontalAlignment="Stretch" Margin="3" > 
         <StackPanel.Style> 
          <Style> 
           <Setter Property="TextBlock.Foreground" Value="Black"></Setter> 
          </Style> 
         </StackPanel.Style> 
         <TextBlock Foreground="White" FontSize="18" TextWrapping="Wrap" Text="{Binding Path=BenefitDesc}"></TextBlock> 
         <Grid Margin="3" HorizontalAlignment="Stretch"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="1*" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition /> 
           <RowDefinition /> 
          </Grid.RowDefinitions> 
          <TextBlock Foreground="White" Margin="3" FontSize="16" TextWrapping="Wrap">Price:</TextBlock> 
          <TextBox x:Name="txtUpdate" FontSize="16" Grid.Column="1" TextWrapping="Wrap" Text="{Binding Path=Price}" Margin="3"> 
          </TextBox> 
         </Grid> 
        </StackPanel> 
       </Border> 
      </Grid> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ListBox x:Name="lsItem" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
       HorizontalContentAlignment="Stretch" Background="#FF2CB7D2" SelectionChanged="lsBenPriceEditor_SelectionChanged" 
       ItemTemplate="{StaticResource Template}"> 
      <ListBox.ItemContainerStyle> 
       <Style> 
        <Setter Property="Control.Padding" Value="0"></Setter> 
        <Style.Triggers> 
         <Trigger Property="ListBoxItem.IsSelected" Value="True"> 
          <Setter Property="ListBoxItem.Background" Value="DarkRed" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </ListBox.ItemContainerStyle> 
     </ListBox> 
    </Grid> 
+0

Voir si http://stackoverflow.com/questions/329556/focus-on-a-textbox-in-a-datatemplate aide. –

+0

@MattHamilton J'essaie la première réponse sur cette page et continue à rencontrer la méthode d'erreur n'existe pas sur la ligne donnée: var myTemplate = FindResource ("MyTemplateKey"); J'ai changé le var en élément de cadre, mais cette fois je reçois une référence d'objet d'erreur non définie à une référence d'un objet –

+0

selon le commentaire sur cette réponse, assurez-vous de convertir la valeur de retour de FindResource en tant que DataTemplate. FindResource renvoie juste un System.Object. –

Répondre

1

Vous pouvez brancher l'événement SelectionChanged dans votre code derrière pour votre Listbox et la boucle là, vous pouvez par l'enfant visuel de votre SelectedItem pour trouver votre textBox et appelez simplement textBox.Focus() pour mettre l'accent sur la zone de texte.

code

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ListBox lb = sender as ListBox; 
    ListBoxItem lbi = (ListBoxItem)lb.ItemContainerGenerator.ContainerFromItem(lb.SelectedItem); 
    TextBox textBox = GetVisualChild<TextBox>(lbi); 
    if (textBox != null) 
     textBox.Focus(); 
} 

private T GetVisualChild<T>(Visual parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
     child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
     break; 
     } 
    } 
    return child; 
} 

GetVisualChild est méthode générique que vous pouvez utiliser en boucle à travers les VisualChildren pour le passé UIControl(ListBoxItem in your case) et retourner l'élément désiré T(TextBox in your case) de celle-ci la liste VisualChildren.

De plus, la propriété IsFocused exposée par UIElement est une propriété get only.

public bool IsFocused { get; } 

C'est la raison pour laquelle vous obtenez cette erreur ..

Questions connexes