我有一个添加到ListView的ListViewItem,但我不知道它被添加到哪个ListView。
我想(通过ListViewItem)能够从项目本身中获取ListView。
我尝试使用Parent属性,但由于某种原因,它返回一个StackPanel。
有什么想法吗?
答案 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;