我有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);
}
提前致谢!!!
答案 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
如果您使用第二种方法,您可能会看到一次删除一个标签项,这可能是您不想看到的。