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