2016-10-11 9 views
0

Я пытаюсь пропустить дочерние элементы элемента управления вкладкой, чтобы узнать, какие флажки установлены для проверки или проверки. Я нашел различные ответы на SO, но я не могу заставить код делать то, что мне нужно. Вот то, что я до сих пор:Как с помощью CheckBoxes в TabControl с использованием WPF?

foreach (System.Windows.Controls.TabItem page in this.MainWindowTabControl.Items) 
{ 
     if(VisualTreeHelper.GetChild(page, 0).GetType() == typeof(System.Windows.Controls.Grid)) 
     { 
      var grid = VisualTreeHelper.GetChild(page, 0); 
      int gridChildCount = VisualTreeHelper.GetChildrenCount(grid); 
      for(int i = 0; i < gridChildCount; i++) 
      { 
       if(VisualTreeHelper.GetChild(grid, i).GetType() == typeof(CheckBox)) 
       { 
        CheckBox box = (CheckBox)VisualTreeHelper.GetChild(grid, i); 
        if (boxer.IsChecked == true) 
         checkboxes.Add(box); 
       } 
      } 
      //do work 
     } 
} 

Скорее всего, я имею в виду неправильно о том, как класс VisualTreeHelper работ. Я полагаю, что я могу продолжать работать, несмотря на то, что код XAML продолжает перемещаться в более глубокие и глубокие детишки Tab Control? В настоящее время мой код на XAML моего WPF выглядит следующим образом:

<TabControl x:Name="MainWindowTabControl" HorizontalAlignment="Left" Height="470" 
    Margin="0,10,0,0" VerticalAlignment="Top" Width="1384"> 
     <TabItem Header="TabItem"> 
      <Grid Background="#FFE5E5E5" Margin="0,-21,0,0"> 
       <CheckBox Name="testBox" Content="Check Box" 
      HorizontalAlignment="Left" VerticalAlignment="Top" Margin="1293,50,0,0"/> 
      </Grid> 
     </TabItem> 
</TabControl> 

Итак, я понимаю, что я должен работать от ребенка к ребенку, а это означает, использовать VisualTreeHelper, чтобы получить ребенок контрольной Tab (выберите вкладку Item), затем получите дочерние элементы TabItem (выберите сетку), затем получите дочерние элементы Grid, а затем я могу, наконец, пропустить дочерние элементы (флажки), чтобы получить нужную мне информацию. Если я ошибаюсь, может кто-нибудь объяснить, в чем я ошибаюсь?

EDIT: Изменен Checkbox XAML для правильного кода

+2

DataBind эти флажки в виде ViewModel массив булевых значений. Затем перебираем эту коллекцию. Это способ WPF (aka MVVM) сделать это. – code4life

+0

@ code4life Все еще относительно нова для C#, в чем причина или цель этой методологии? – Rinktacular

+0

Сделайте себе серьезную услугу и изучите образец MVVM. Это другой способ мышления о программировании, чем вы привыкли, но это значительно упростит разработку WPF. Если вы не используете его, вы в конечном итоге будете сражаться с WPF почти на каждом шагу. –

ответ

1

Насколько мне известно, идет, нет необходимости делать то, что вы делаете, чтобы получить ребенок от родителей. Вы можете использовать класс LogicalTreeHelper. Он позволит вам запрашивать объекты через метод GetChildren.
Ваш код должен выглядеть следующим образом:
XAML:

<TabControl x:Name="MainWindowTabControl" HorizontalAlignment="Left" 
Margin="0,10,0,0" VerticalAlignment="Top" Height="181" Width="247"> 
     <TabItem Header="TabItem"> 
      <Grid Background="#FFE5E5E5" Margin="0,-21,0,0" x:Name="gridChk"> 
       <CheckBox x:Name="testBox" Content="Check Box" 
     HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,50,0,0"/> 
      </Grid> 
     </TabItem> 
    </TabControl> 

C#:

List<CheckBox> boxesList = new List<CheckBox>(); 
    //The named Grid, and not TabControl 
    var children = LogicalTreeHelper.GetChildren(gridChk); 

    //Loop through each child 
    foreach (var item in children) 
    { 
     var chkCast = item as CheckBox; 
     //Check if the CheckBox object is checked 
     if (chkCast.IsChecked == true) 
     { 
      boxesList.Add(chkCast); 
     } 
    } 
+0

Это работает отлично! Я планирую научиться WVVM, как прокомментировали другие, но это работает для цели этого вопроса. Большое спасибо! – Rinktacular