FindVisualChild在DataTemplate中找不到Grid
本文关键字:找不到 Grid DataTemplate FindVisualChild | 更新日期: 2023-09-27 18:13:35
我试图使用WPF的"FindVisualChild"的基本实现,以便找到存在于ListBox
的DataTemplate
中的特定Grid
。
实现如下:
private DependencyObject FindVisualChild<T>(DependencyObject obj, string name)
{
Console.WriteLine(((FrameworkElement)obj).Name);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
FrameworkElement fe = child as FrameworkElement;
//not a framework element or is null
if (fe == null) return null;
if(!string.IsNullOrEmpty(fe.Name))
Console.WriteLine(fe.Name);
if (child is T && fe.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase))
return child;
else
{
//Not found it - search children
DependencyObject nextLevel = FindVisualChild<T>(child, name);
if (nextLevel != null)
return nextLevel;
}
}
return null;
}
我的问题是,这段代码昨天正在工作,以找到我在DataTemplate
中定义的Grid
,名称为"MainTermServListGrid",如下所示:
<ListBox HorizontalAlignment="Stretch" Grid.Row="1" x:Name="TermServListBox" ItemsSource="{Binding TermServs}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid x:Name="MainTermServListGrid">
//code here
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
然而,今天当我尝试使用相同的方法来找到Grid
时,结果总是null。如果我调试并逐步执行代码,看起来它甚至没有找到DataTemplate
中存在的任何项。
我在用项目填充ListBox
之后立即调用FindVisualChild
方法。可能是我等待的时间不够长,窗口没有足够的时间来完成初始化并在列表框中呈现新项目,然后我试图在该列表框中找到特定的子项目?
如果是这样的话,一个简单的调用await Task.Delay(500)
工作给UI足够的时间来完成加载?还是我做错了什么?
事实证明,我没有给UI足够的时间来完成加载。我相信这是由于我正在使用特定方法填充ListBox
的项目,并且在该方法的末尾,我正在引发一个Event
,它触发了Window
代码中的搜索。
因为从加载完成到触发事件查找它们之间没有间隔时间,所以我认为ui没有时间完成初始化。
基本上我所做的所有修复问题在我的事件处理程序如下:
private async void ViewModelOnListPopulated(object sender, EventArgs eventArgs)
{
await Task.Delay(500);
//Continue on to find the visual child...
}