我有一个用ItemsControl
制作的StackPanel
,并使用ItemSource
对象DataTemplate
。
我知道如何从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
值。我可以直观地看到我在运行时生成的所有按钮:
var brandButton = (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]);
我希望它对你有所帮助。
BrandButtonsStackPanel.FindVisualChildren<Button>();
要获取列表中按钮的所有详细信息,您可以使用此选项
List<Button> btnList=BrandButtonsStackPanel.FindVisualChildren<Button>().ToList();