2011-01-22 2 views
5

У меня есть ListViewItem, который добавлен в ListView, но я не знаю, к какому списку ListView он добавлен.Как получить ListView из ListViewItem?

Я хотел бы (через ListViewItem) захватить ListView из самого элемента.

Я попытался использовать свойство Parent, но по какой-то причине он возвращает StackPanel.

Любые идеи?

+0

Там нет таких проблем с MVVM. – vorrtex

+5

Как будто это имело какое-либо отношение к этому ... –

ответ

5

Я получил это для запуска и работы:

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

Хотя это довольно старый вопрос, он не работает для WinRT

Для WinRT, вам необходимо пройти визуальное дерево используя VisualTreeHelper вместо LogicalTreeHelper, чтобы найти ListView из ListViewItem

+1

+1 может помочь другим. –

0

Я использую подход, отличный от тех, которые уже были предложены.

У меня есть только несколько элементов управления ListView (два или три), поэтому я могу сделать следующее.

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

Это может быть использован с петлей Еогеаспа но если существует сотни ListView управления для перебора, то глядя вверх по родительской ListView из ListViewItem, вероятно, более эффективный (как и большинство других ответов предположить). Однако я считаю, что мое решение чище (немного). Надеюсь, это поможет кому-то!

0

Недавно я обнаружил это краткое решение:

ListView listView = ItemsControl.ItemsControlFromItemContainer(listViewItem) as ListView; 
Смежные вопросы