You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在WinUI3(C++/WinRT)中如何获取点击按钮所属的ListViewItem?

在WinUI3(C++/WinRT)中获取Button所属的ListViewItem

有两种可靠的方法可以实现需求:

方法一:遍历视觉树查找父级ListViewItem

通过VisualTreeHelper从点击的Button开始向上遍历视觉树,直到找到类型为ListViewItem的元素:

void MainPage::Button_Click(Windows::Foundation::IInspectable const& sender, Microsoft::UI::Xaml::RoutedEventArgs const& e)
{
    auto button = sender.as<Microsoft::UI::Xaml::Controls::Button>();
    auto currentElement = button.as<Microsoft::UI::Xaml::DependencyObject>();

    // 向上遍历视觉树
    while (currentElement != nullptr)
    {
        if (currentElement.IsInstanceOf<Microsoft::UI::Xaml::Controls::ListViewItem>())
        {
            auto listViewItem = currentElement.as<Microsoft::UI::Xaml::Controls::ListViewItem>();
            // 在此处使用获取到的ListViewItem
            break;
        }
        currentElement = Microsoft::UI::Xaml::Media::VisualTreeHelper::GetParent(currentElement);
    }
}

方法二:通过DataContext结合ContainerFromItem获取

利用Button的DataContext拿到绑定的Message对象,再通过ListView的ContainerFromItem方法获取对应的ListViewItem:

void MainPage::Button_Click(Windows::Foundation::IInspectable const& sender, Microsoft::UI::Xaml::RoutedEventArgs const& e)
{
    auto button = sender.as<Microsoft::UI::Xaml::Controls::Button>();
    // 获取绑定的Message数据对象
    auto message = button.DataContext().as<local::Message>();
    
    if (message != nullptr)
    {
        // 通过ListView获取对应容器
        auto listViewItem = listViewMessages.ContainerFromItem(message).as<Microsoft::UI::Xaml::Controls::ListViewItem>();
        if (listViewItem != nullptr)
        {
            // 在此处使用获取到的ListViewItem
        }
    }
}

方法对比

  • 视觉树遍历:不依赖数据绑定,适用性更广,即使Item没有绑定数据也能生效。
  • DataContext方法:代码更简洁,依赖ListView的ItemsSource绑定,适合数据驱动的场景。

内容的提问来源于stack exchange,提问作者Claudiu HBann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:48:17