2013-03-26 41 views
1

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

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

是TabControl中的DataGrid – 2013-03-26 18:30:37

+0

是的,当然在标签项 – 2013-03-26 18:31:29

回答

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"); 

我希望它可以让你,你打算。

+0

完美,适合我的作品!!!!!谢谢你,先生!!! – 2013-03-27 14:11:58

0

我打算假设你的FindChild方法使用VisualTreeHelper来找到它的孩子。

在第一次迭代中,TabItemContent已通过布局传递,并且可见。这意味着TabItemContent将在视觉树中。

但是,对于其他选项卡项目,它们的Content尚未经过布局阶段(只有在父项被选中时才添加到可视化树中,然后必须通过布局/渲染阶段) ,并且不会在视觉树中。

有一对夫妇的方式获得TabItem未经过布局传递作为选定选项卡中的子内容:

1)你可以尝试使用LogicalTreeHelper找到Grid你”重新寻找(并且您可能必须搜索TabItemContent,而不是TabControl)。

2)你可以把你的代码了while循环,并在加载优先做调度的回调:

void RemoveAllItems() 
{ 
    if (!tc.HasItems) return; 

    TabItem ti = tc.SelectedItem as TabItem; 
    if (ti.Header == "Продажа") 
    { 
     var 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); 
     } 
    } 

    Dispatcher.BeginInvoke(new Action(RemoveAllItems), DispatcherPriority.Loaded); 
} 

如果使用第二种方法,你可能能够看到一次只移除一个标签项目,这可能是您不想看到的内容。

+0

内我无法弄清楚如何在我的代码中实现它。请帮助我 – 2013-03-27 10:44:33

+0

我添加了您的原始代码以使答案更清晰。 – 2013-03-27 13:02:07

+0

代码正在工作,但这不是我想要的。让我解释一下我在做什么,我有选项卡项目让我们说出售选项卡项目。在每个出售选项卡项目我检查DataGrid项目计数,如果它是> 0我正在返回到股票。在你的代码中它只返回最后一个(出售标签项目),但之前的标签项目(它可能有多个销售标签项目)正在丢失(不返回到我的股票 – 2013-03-27 13:19:45