为什么ItemsControl中的控件名称未显示在Wpf中的代码隐藏文件中

为什么ItemsControl中的控件名称未显示在Wpf中的代码隐藏文件中,wpf,Wpf,我使用ItemsControl和DataTemplate创建了简单示例。。我想用textblocs中的C#代码绑定这些值。但我没有在代码隐藏文件中获得textblock名称和Datatemplate名称。请告诉我原因。。如何获取控件的名称 <ItemsControl ItemsSource="{Binding Path=.}" > <ItemsControl.ItemTemplate> <DataTemplat

我使用ItemsControl和DataTemplate创建了简单示例。。我想用textblocs中的C#代码绑定这些值。但我没有在代码隐藏文件中获得textblock名称和Datatemplate名称。请告诉我原因。。如何获取控件的名称

<ItemsControl ItemsSource="{Binding Path=.}" >
            <ItemsControl.ItemTemplate>
                <DataTemplate x:Name="datatemp">
                        <StackPanel Orientation="Horizontal"> 

<TextBlock  x:Name="Textblock1" Text="{Binding }" FontWeight="Bold" ></TextBlock>
                        <TextBlock Text=", " />
                            <TextBlock Text="{Binding }" x:Name="Textblock2"></TextBlock>
                        <TextBlock Text=", " />
                            <TextBlock Text="{Binding }" x:Name="Textblock3"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>


但是在这里,在代码文件Textblock1和其他不显示的名称中,即使我只使用了“Name”而不是“x:Name”

也不会为DataTemplate生成任何成员。datatemplate只是用于在运行时动态实例化项,因此,在您将项添加到ItemsControl之前,这些控件甚至不存在。即使如此,我认为datatemplate中各个控件的名称对于从datatemplate的标记中使用也很有用

加载ItemsControl时,如果需要,可以生成名称

    private void OnPopupItemsLoaded(object sender, RoutedEventArgs e)
    {
        var itemsControl = sender as ItemsControl;

        itemsControl.ApplyTemplate();
        var numItems = itemsControl.ItemContainerGenerator.Items.Count();
        for (var i = 0; i < numItems; i++)
        {
            var container = itemsControl.ItemContainerGenerator.ContainerFromIndex(i);
            textBlock = FindVisualChild<TextBlock>(container);
            if (textBlock != null)
            {
                textBlock.Name = SanitizeName(textBlock.Text);
                textBlock.Uid = $"Item{i}";
            }
        }
    }

    private static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    return (T)child;
                }

                T childItem = FindVisualChild<T>(child);
                if (childItem != null)
                {
                    return childItem;
                }
            }
        }

        // None found
        return null;
    }

    // FrameworkeElement.Name must start with an underscore or letter and
    // only contain letters, digits, or underscores.
    private string SanitizeName(string textString)
    {
        // Text may start with a digit
        var sanitizedName = "_";

        foreach (var c in textString)
        {
            if (char.IsLetterOrDigit(c))
            {
                sanitizedName += c;
            }
            else
            {
                sanitizedName += "_";
            }
        }

        return sanitizedName;
    }

PopupItemsLoaded上的私有void(对象发送方,RoutedEventArgs e)
{
var itemsControl=发送方作为itemsControl;
itemsControl.ApplyTemplate();
var numItems=itemsControl.ItemContainerGenerator.Items.Count();
对于(变量i=0;i
您想对数据模板和文本块做什么?谢谢。所以我不能在数据模板之外使用它们(DT中的控件)。我说得对吗?