C# 单击事件时查找按钮的父ListViewItem

C# 单击事件时查找按钮的父ListViewItem,c#,wpf,listview,C#,Wpf,Listview,我有一个按钮作为每个ListViewItem的最后一列。按下按钮时,我需要在单击事件中找到按钮(发件人)父列表视图项 我试过: ListViewItem itemToCancel = (sender as System.Windows.Controls.Button).Parent as ListViewItem; DiscoverableItem itemToCancel = (sender as System.Windows.Controls.Button).Parent as Disco

我有一个按钮作为每个ListViewItem的最后一列。按下按钮时,我需要在单击事件中找到按钮(发件人)父列表视图项

我试过:

ListViewItem itemToCancel = (sender as System.Windows.Controls.Button).Parent as ListViewItem;

DiscoverableItem itemToCancel = (sender as System.Windows.Controls.Button).Parent as DiscoverableItem;
DiscoverableItem是listview绑定到的类型。我尝试了所有不同的组合,每个组合都返回null

谢谢,
Meisenman

您可以使用
VisualTreeHelper
获取某个元素的祖先视觉。当然,它只支持方法
GetParent
,但我们可以实现一些递归方法或类似的方法,在树上遍历,直到找到所需的父类型:

public T GetAncestorOfType<T>(FrameworkElement child) where T : FrameworkElement
{
    var parent = VisualTreeHelper.GetParent(child);
    if (parent != null && !(parent is T)) 
        return (T)GetAncestorOfType<T>((FrameworkElement)parent);
    return (T) parent;
}
public T GetAncestorOfType(FrameworkElement子级),其中T:FrameworkElement
{
var parent=visualtreeheloper.GetParent(子级);
if(parent!=null&!(parent为T))
返回(T)GetAncestorOfType((FrameworkElement)父级);
返回(T)父级;
}
然后您可以像这样使用该方法:

var itemToCancel = GetAncestorOfType<ListViewItem>(sender as Button);
//more check to be sure if it is not null 
//otherwise there is surely not any ListViewItem parent of the Button
if(itemToCancel != null){
   //...
}
var itemToCancel=GetAncestorOfType(发送者作为按钮);
//进一步检查以确保它是否为空
//否则,该按钮肯定没有任何ListViewItem父项
if(itemToCancel!=null){
//...
}

谢谢!测试和工作。我用它来查找用户控件的父控件,但没有意识到listViewItem不是按钮的直接父控件+1&接受