Visual Tree Finder在搜索数据网格时返回null

时间:2013-03-26 18:23:15

标签: wpf wpfdatagrid tabcontrol tabitem

我有Tab控件,它有很多标签项,我在关闭标签项时检查数据网格项目计数。它第一次工作正常(我的意思是在第一次迭代)。关闭一个标签项后,在第二次迭代中,sellDtg为空。有谁知道它为什么会发生?我担心这是UI问题,布局没有刷新。请帮助我或显示方向。

while (tc.HasItems) 
        {
            TabItem ti = tc.SelectedItem as TabItem;
            if (ti.Header == "Продажа") 
            {
                Microsoft.Windows.Controls.DataGrid sellDtg = FindChild<Microsoft.Windows.Controls.DataGrid>(tc, "SellDataGrid");
                if (sellDtg.Items.Count > 0)
                {
                    Sell sl = new Sell();
                    if (Sell.basketfromSellDateListBox == false)
                    {
                        sl.ClearBasket(sellDtg);
                        Sell.ClearFromSellBasket((int)sellDtg.Tag);
                    }
                }
            }
            if (ti != null)
                tc.Items.Remove(ti);

        }

提前致谢!!!

2 个答案:

答案 0 :(得分:1)

我为FindChildLogical下面的LogicalTreeHelper编写了一个简单的public static T FindChildLogical<T>(DependencyObject parent, string childName) where T : DependencyObject { if (parent == null) return null; var child = LogicalTreeHelper.FindLogicalNode(parent, childName); return (T)child; } 函数:

Microsoft.Windows.Controls.DataGrid sellDtg = FindChildLogical<Microsoft.Windows.Controls.DataGrid>(ti, "SellDataGrid");

你称之为:

{{1}}

我希望它能让你到达目的地。

答案 1 :(得分:0)

我将假设您的FindChild方法使用VisualTreeHelper来查找其子项。

在第一次迭代中,TabItem的{​​{1}}已通过布局传递,并且可见。这意味着Content的{​​{1}}将位于可视树中。

但是,对于其他选项卡项,他们的TabItem尚未通过布局传递(只有在选择父级时才会将其添加到可视树中,然后必须通过布局/渲染通道),并且不会在可视树中。

有两种方法可以将未通过布局传递的Content的子内容作为选定的标签:

1)您可以尝试使用Content找到您要查找的TabItem(并且您可能需要搜索LogicalTreeHelper的{​​{1}},不是Grid)。

2)您可以从while循环中取出代码,并以加载的优先级对调度程序进行回调:

Content

如果您使用第二种方法,您可能会看到一次删除一个标签项,这可能是您不想看到的。