如何从 ListViewItem 的 ItemTemplate 中获取元素?

How can I get an element from within a ListViewItem's ItemTemplate?

我有一个 ListView 使用自定义 ItemTemplate(不是每个人吗?):

<ListView>
  <!-- ... -->
  <ListView.ItemTemplate>
    <DataTemplate x:DataType="x:String">
      <MyGreatControl Thing="{x:Bind}" />
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

MyGreatControl 今天内置了大量的键盘处理代码,但由于一些重构,我需要将实际的处理程序移至 ListView 本身。但是,我不想将 MyGreatControl 中的所有代码移动到 ListView(出于多种原因)。

如果我有一个任意的 ListViewItem(例如,I can get from an event handler),我如何访问其 DataTemplate 中的 MyGreatControl 实例?

MyGreatControl^ GetMyGreatControlFromListViewItem(ListViewItem^ listViewItem) {
    // ???
}

您想使用 ContentTemplateRoot!

MyGreatControl^ GetMyGreatControlFromListViewItem(ListViewItem^ listViewItem) {
  return safe_cast<MyGreatControl^>(listViewItem->ContentTemplateRoot);
}

这也适用于任何任意元素——例如,如果您有 StackPanel,ContentTemplateRoot 将 return 您想要的 StackPanel 实例:

<ListView.ItemTemplate>
  <DataTemplate x:DataType="x:String">
    <StackPanel><!-- This is what you get! -->
      <TextBlock Text="{x:Bind}" />
      <Button Content="Foo" IsTabStop="False" />
    </StackPanel>
  </DataTemplate>
</ListView.ItemTemplate>

然后您可以使用正常的可视化树导航来查找 Children 等