如何从ListViewItem获取ListView?

时间:2011-01-22 19:04:33

标签: wpf

我有一个添加到ListView的ListViewItem,但我不知道它被添加到哪个ListView。

我想(通过ListViewItem)能够从项目本身中获取ListView。

我尝试使用Parent属性,但由于某种原因,它返回一个StackPanel。

有什么想法吗?

4 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:4)

虽然这是一个相当古老的问题,但它对WinRT不起作用

对于WinRT,您需要使用VisualTreeHelper而不是LogicalTreeHelper遍历Visual Tree,以从ListViewItem中查找ListView

答案 2 :(得分: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)
    {
        ...
    }
}

这可以与foreach循环一起使用但是如果有数百个ListView控件要迭代,那么查找ListViewItem的父ListView可能更有效(正如大多数其他答案所示)。但是我认为我的解决方案更清晰(有点)。希望它可以帮助别人!

答案 3 :(得分:0)

我最近发现了这个简洁的解决方案:

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