FindVisualChild在DataTemplate中找不到Grid

本文关键字:找不到 Grid DataTemplate FindVisualChild | 更新日期: 2023-09-27 18:13:35

我试图使用WPF的"FindVisualChild"的基本实现,以便找到存在于ListBoxDataTemplate中的特定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足够的时间来完成加载?还是我做错了什么?

FindVisualChild在DataTemplate中找不到Grid

事实证明,我没有给UI足够的时间来完成加载。我相信这是由于我正在使用特定方法填充ListBox的项目,并且在该方法的末尾,我正在引发一个Event,它触发了Window代码中的搜索。

因为从加载完成到触发事件查找它们之间没有间隔时间,所以我认为ui没有时间完成初始化。

基本上我所做的所有修复问题在我的事件处理程序如下:

private async void ViewModelOnListPopulated(object sender, EventArgs eventArgs)
{
    await Task.Delay(500);
    //Continue on to find the visual child...
}