0

我使用 ItemsControl 和 DataTemplate 创建了简单的示例。我想使用文本块中的 C# 代码绑定值。但是我没有在代码隐藏文件中获得文本块名称和数据模板名称,请告诉我为什么。获取控件的名称?

<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 和其他名称中,即使我只使用了“名称”而不是“x:名称”,也没有显示

4

2 回答 2

0

不会为 DataTemplate 生成任何成员。数据模板仅用于在运行时动态实例化项目,因此在您将项目添加到 ItemsControl 之前,控件甚至不存在,即便如此,我认为 DataTemplate 中各个控件的名称仅对从 DataTemplate 内部使用有用标记。

于 2012-05-04T06:58:21.277 回答
0

如果需要,您可以在加载 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;
    }

于 2021-03-19T21:22:30.080 回答