2011-01-22 15 views
5

Tengo un ListViewItem que se agrega a un ListView, pero no sé a qué ListView se agrega.¿Cómo obtener un ListView de un ListViewItem?

Me gustaría (a través del ListViewItem) poder tomar el ListView del propio artículo.

Intenté usar la propiedad Parent, pero por alguna razón, devuelve un StackPanel.

¿Alguna idea?

+0

No hay tales problemas con MVVM. – vorrtex

+5

Al igual que tuvo algo que ver con esto ... –

Respuesta

5

he conseguido esto para ejecutar y trabajo:

private void Window_Loaded(object s, RoutedEventArgs args) 
    { 
     var collectionview = CollectionViewSource.GetDefaultView(this.listview.Items); 
     collectionview.CollectionChanged += (sender, e) => 
     { 
      if (e.NewItems != null && e.NewItems.Count > 0) 
      {     
       var added = e.NewItems[0]; 
       ListViewItem item = added as ListViewItem; 
       ListView parent = FindParent<ListView>(item); 
      } 
     }; 

    } 
    public static T FindParent<T>(FrameworkElement element) where T : FrameworkElement 
    { 
     FrameworkElement parent = LogicalTreeHelper.GetParent(element) as FrameworkElement; 

     while (parent != null) 
     { 
      T correctlyTyped = parent as T; 
      if (correctlyTyped != null) 
       return correctlyTyped; 
      else 
       return FindParent<T>(parent); 
     } 

     return null; 
    } 
4

Si bien esto es bastante una vieja cuestión, que no funciona para WinRT

Para WinRT, es necesario atravesar el árbol Visual usando VisualTreeHelper en lugar de LogicalTreeHelper para encontrar el ListView del ListViewItem

+1

+1 podría ayudar a otros. –

0

Estoy usando un enfoque diferente de los que ya se sugirieron.

Solo tengo un puñado de controles ListView (dos o tres) para poder hacer lo siguiente.

ListViewItem listViewItem = e.OriginalSource as ListViewItem; 
if (listViewItem == null) 
{ 
    ... 
} 
else 
{ 
    if (firstListView.ItemContainerGenerator.IndexFromContainer(listViewItem) >= 0) 
    { 
     ... 
    } 
    else if (secondListView.ItemContainerGenerator.IndexFromContainer(listViewItem) >= 0) 
    { 
     ... 
    } 
} 

Esto podría ser utilizado con un bucle foreach pero si hay cientos de ListView controla para recorrer a continuación, buscar el ListView padre del ListViewItem es probablemente más eficiente (ya que la mayoría de las otras respuestas sugieren). Sin embargo, creo que mi solución es más limpia (un poco). Espero que ayude a alguien!

0

Recientemente he descubierto esta solución concisa:

ListView listView = ItemsControl.ItemsControlFromItemContainer(listViewItem) as ListView; 
Cuestiones relacionadas