在WinUI3(C++/WinRT)中如何获取点击按钮所属的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
相关产品推荐
相关产品推荐

