如何使用数据模板从 ItemsControl 获取 UIElements



我有一个用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();

最新更新