如何使用DataTemplate从ItemsControl获取UIElements?

时间:2018-03-21 13:24:40

标签: c# uwp

我使用StackPanelItemsControl使用DataTemplate个对象制作了ItemSource

我知道如何从ItemsControl中的StackPanel获取对象列表:itemsControl.Items

但是,现在我想让UIElement与这些Items相关联。

如果我们有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://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.visualtreehelper

2 个答案:

答案 0 :(得分:0)

我提出了以下扩展方法

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]);

我希望它可以帮到你。

答案 1 :(得分:0)

你可以使用 BrandButtonsStackPanel.FindVisualChildren<Button>();

要获取列表中按钮的所有详细信息,您可以使用此

List<Button> btnList=BrandButtonsStackPanel.FindVisualChildren<Button>().ToList();