如何从 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 等
我有一个 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 等