c# - 如何使用 DataTemplate 从 ItemsControl 获取 UIElement?

标签 c# uwp

我有一个 StackPanel,它是使用 ItemsControlDataTemplate 使用对象的 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/

相关文章:

c# - 使将 CSV 字符串导入到类的列表中更容易

c# - UWP 奇数和偶数元素 ListBoxItem 的不同样式

c# - 异步方法 C# 中的 UWP 进度条

c# - Visual Studio C# Win-Forms 应用程序网络浏览器加载速度非常慢

c# - 什么是 POCO Entity Framework

c# - 在 WinRT - Windows 8 - Metro App 中上次编辑 xml 文件的时间

xaml - 使用RelativePanel 与面板中心右对齐

c# - 在 RichEditBox 中包含当前撤消组中的文本更改?

win-universal-app - 是否可以在 UWP 中获取用户编写的 RichEditBox 文本?

javascript - 使用 moment.js 转换从 C# View 模型接收的 JavaScript 日期