我有一个 StackPanel
,它是使用 ItemsControl
和 DataTemplate
使用对象的 ItemSource
制作的。
我知道如何从 StackPanel
中的 ItemsControl
获取对象列表:itemsControl.Items
但是,现在我想获取与这些 Items
关联的 UIElement
。
如果我们有一个像这样的StackPanel
:
<StackPanel x:Name="BrandButtonsStackPanel" Grid.Row="1" HorizontalAlignment="Center">
<StackPanel.Children>
<ItemsControl ItemsSource="{x:Bind model:BrandMaintainer.VisibleBrands, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="model:BrandInfo">
<Button Tag="{Binding SectionId, Mode=OneWay}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel.Children>
</StackPanel>
我尝试了此方法,但它给了我一个 null
值。我可以直观地看到运行时生成的所有按钮:
varbrandButton = (Button)itemsControl.ContainerFromItem(itemIndex);
有什么想法吗?或者有更好的办法吗?
谢谢
编辑:这表明 UWP 存在 FindChildren 方法。但我没看到...
https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.visualtreehelper
最佳答案
我想出了以下扩展方法
public static IEnumerable<UIElement> GetChildren(this ItemsControl itemsControl)
{
foreach(var item in itemsControl.Items)
{
yield return (UIElement) itemsControl.ItemContainerGenerator.ContainerFromItem(item);
}
}
然后您可以像这样调用它来访问您想要的按钮
var brandButton = (Button) (itemsControl.GetChildren().ToList()[itemIndex]);
希望对你有帮助。
关于c# - 如何使用 DataTemplate 从 ItemsControl 获取 UIElement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49407547/