2013-03-26 2 views
1

У меня есть элемент управления Tab, который имеет много элементов табуляции, я проверяю количество элементов сетки данных при закрытии элементов табуляции. Впервые он работает отлично (я имею в виду на первой итерации). После закрытия одного элемента табуляции на второй итерации sellDtg имеет значение null. Кто-нибудь знает, почему это происходит? Я имею в виду, что это проблема пользовательского интерфейса, макет не обновляется. Пожалуйста, помогите мне или покажите направление.Visual Tree Finder возвращает null при поиске Data Grid

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

Является ли DataGrid в TabControl –

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

Я надеюсь, что он получает вас, где вы собираетесь.

+0

Отлично, отлично работает для меня !!!!! Спасибо, сэр!!! –

0

Я собираюсь принять ваш метод FindChild, используя поиск VisualTreeHelper, чтобы найти его детей.

В первой итерации TabItemContent прошел через макет, и он виден. Это означает, что TabItemContent будет находиться в визуальном дереве.

Однако для других элементов табуляции их Content не прошел через макетный проход (он добавляется только к визуальному дереву, когда его выбрано родителем, и это должно пройти через проход макета/рендеринга) , и не будет в визуальном дереве.

Есть несколько способов, чтобы получить содержание ребенка, находящегося на TabItem, который не был через проход макета, как вкладки:

1) Вы можете попробовать использовать LogicalTreeHelper найти Grid вы» (и вам, скорее всего, придется искать ContentTabItem, а не TabControl).

2) Вы можете взять код из цикла в то время, и сделать обратный вызов на диспетчера в Loaded приоритета:

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

Я не мог понять, как реализовать его в моем коде. Пожалуйста, помогите мне –

+0

Я добавил ваш оригинальный код, чтобы сделать ответ более ясным. –

+0

Код работает, но это не то, что я хочу. Позвольте мне объяснить вам, что я делаю, у меня есть вкладки, скажем, продавать вкладки. В каждом элементе табуляции я проверяю счетчик данных DataGrid Count, если он> 0, я возвращаюсь обратно в Stock. В вашем коде он возвращает только последний (вкладка «Продать вкладку»), но предыдущие элементы табуляции (у нее может быть несколько позиций для продажи) теряются (не возвращаются на мои акции. –

Смежные вопросы