FindVisualChild在DataTemplate中找不到Grid

时间:2015-09-18 14:14:54

标签: c# wpf listbox

我正在尝试为WPF使用“FindVisualChild”的基本实现,以便找到Grid DataTemplate内存在的特定ListBox

实施如下:

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;
}

我的问题是,这段代码昨天正在查找我在Grid中定义的DataTemplate,其名称为“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中存在的任何项目。

我在使用项目填充FindVisualChild后立即调用ListBox方法。可能是因为我没有等待足够长的时间,在我尝试在该列表框中找到特定的孩子之前,窗口没有足够的时间来完成初始化并在列表框中显示新项目吗?

如果是这种情况,是否可以通过简单的await Task.Delay(500)调用来为UI提供足够的时间来完成加载?或者我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

原来我认为我没有给UI足够的时间来完成加载。我相信这是因为我使用特定方法填充了ListBox项目,并且在该方法的最后我提出Event来触发{{1}中的搜索代码隐藏。

因为从完成项目加载到提升事件之间的时间从来没有过一段时间,我不认为ui有时间完成初始化。

基本上我在事件处理程序中解决问题的方法如下:

Window