在单击事件上查找按钮的父ListViewItem

本文关键字:ListViewItem 按钮 查找 单击 事件 | 更新日期: 2023-09-27 18:25:10

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

我试过:

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

DiscoverableItem是列表视图绑定到的类型。我尝试了所有不同的组合,每个组合都返回null。

谢谢,梅森曼

在单击事件上查找按钮的父ListViewItem

您可以使用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;
}

然后你可以使用这样的方法:

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){
   //...
}