2010-12-14 69 views
1

J'ai un contrôle ListView avec TextBox et Button dans le ListViewItem, mon problème est que lorsque vous entrez dans une zone de texte, la ligne ne sélectionne pas. Si vous voulez sélectionner une ligne, vous devez cliquer quelque part dans la ligne où il n'y a pas de contrôle.WPF ListView élément sélectionné problème

Comment puis-je faire en sorte que la ligne soit automatiquement sélectionnée lorsque je clique sur ou entre dans un contrôle enfant d'une ligne?

J'ai essayé sur le bouton événement click, mais sans chance:

 DependencyObject dep = (DependencyObject)sender; 
     while ((dep != null) && !(dep is ListViewItem)) 
     { 
      dep = VisualTreeHelper.GetParent(dep); 
     } 

     if (dep != null) 
     { 
      lvRoutes.SelectedItem = (ListViewItem)dep; 
     } 

Il garder toujours la première ligne sélectionnée.

Merci d'avance.

+0

double possible de [sélectionner un élément de la zone de texte dans une zone de liste ne change pas sélectionné item de la listbox] (http://stackoverflow.com/questions/653524/selecting-a -textbox-item-dans-une-listbox-ne-change-pas-l'élément-choisi-du-li) –

Répondre

0

essayer d'utiliser les propriétés attachées

public static class ItemSelector 
{ 
    public static DependencyProperty MakeSelectionProperty = 
     DependencyProperty.RegisterAttached("MakeSelection", 
     typeof(bool?), 
     typeof(ItemSelector), 
     new PropertyMetadata(null, OnMakeSelectionPropertyChanged)); 

    public static DependencyProperty ItemsControlProperty = 
     DependencyProperty.RegisterAttached("ItemsControl", 
     typeof(ItemsControl), 
     typeof(ItemSelector)); 

    public static void SetMakeSelection(
     DependencyObject d, bool value) 
    { 
     d.SetValue(MakeSelectionProperty, value); 
    } 

    public static void SetItemsControl(
     DependencyObject d, ItemsControl value) 
    { 
     d.SetValue(ItemsControlProperty, value); 
    } 

    private static void OnMakeSelectionPropertyChanged(
     DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var itemsControl = d.GetValue(ItemsControlProperty) 
      as ItemsControl; 
     if (itemsControl == null) 
      return; 
     ((ListBoxItem) itemsControl.ContainerFromElement(d)) 
      .IsSelected = true; 
    } 

et Heres son utilisation

<ListView ItemsSource="{Binding}" SelectionMode="Single"> 
<ListView.ItemTemplate> 
    <DataTemplate> 
    <TextBox Text="{Binding SomeText}" 
      w:ItemSelector.MakeSelection="{Binding RelativeSource= 
       {RelativeSource Self}, Path=IsFocused}" 
      w:ItemSelector.ItemsControl="{Binding RelativeSource= 
       {RelativeSource FindAncestor, AncestorType= 
        {x:Type ListView}}}" Margin="10" /> 
    </DataTemplate> 
</ListView.ItemTemplate>