2015-06-29 62 views
1

項目我有一個TreeView得到TreeView的C#

<TreeView Name="files" Margin="0,0,569,108" Grid.Row="1" ItemsSource="{Binding s1}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Members}" > 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}" /> 
      </StackPanel> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <CheckBox Name="CheckBox111" Checked="FileCheckBox_Checked" Unchecked="FileCheckBox_Unchecked"> 
         <ContentPresenter> 
          <ContentPresenter.Content> 
           <StackPanel Orientation="Horizontal"> 
            <Image Source="file.jpg" Margin="5,0,5,0" Width="20" Height="20" /> 
            <TextBlock Text="{Binding Name}" /> 
           </StackPanel> 
          </ContentPresenter.Content> 
         </ContentPresenter> 
        </CheckBox> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 

    </TreeView.ItemTemplate> 
</TreeView> 

,我想檢查所有checkBoxs在後臺代碼:

private void AllFilesCheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    foreach (Object item in (files as ItemsControl).Items) 
    { 
     TreeViewItem t = files.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; 

     foreach (Object item1 in t.Items) 
     { 
      // TreeViewItem t2 = item1 as TreeViewItem; 
     // CheckBox t1 =item1 as CheckBox; 
     } 
    } 
} 

但我不能訪問複選框。 ..我不知道如何獲得它。

謝謝。

編輯:我試了almulo的答案,我幾乎得到它。 我有這樣的:

http://i.stack.imgur.com/Za2ho.png

我想要得到的內容中(紅色標誌在右),但我還沒有child.Content

+0

你有很多的複選框? –

回答

0

試試這個代碼,

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
      { 
       if (depObj != null) 
       { 
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
        { 
         DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
         if (child != null && child is T) 
         { 
          yield return (T)child; 
         } 

         foreach (T childOfChild in FindVisualChildren<T>(child)) 
         { 
          yield return childOfChild; 
         } 
        } 
       } 
      } 

      private void AllFilesCheckBox_Checked(object sender, RoutedEventArgs e) 
      { 
       var test = FindVisualChildren<CheckBox>(tvEmps); 
      } 
+0

我編輯了我的問題,我添加了圖片,看看那裏。謝謝 –

0

首先,使用您的代碼,您只能訪問所有項目的第二級。也許在你的情況下,這已經足夠了,但是我會讓方法遞歸,因此它適用於任何深度的樹。

我也使用擴展方法來查找實際控件,所以即使CheckBox嵌套在容器中或置於其他控件之間,它也可以工作。

private void AllFilesCheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    var checkBoxes = GetAllCheckBoxes(files); 

    foreach (var checkBox in checkBoxes) 
    { 
     // Do stuff with the CheckBoxes 
    } 
} 

private List<CheckBox> GetAllCheckBoxes(ItemsControl itemsControl) 
{ 
    var list = new List<CheckBox>(); 

    foreach (var item in itemsControl.Items) 
    { 
     var itemContainer = itemsControl.ItemContainerGenerator.ContainerFromItem(item); 
     var checkBox = itemContainer.GetChildOfType<CheckBox>(); 

     if (checkBox != null) 
      list.Add(checkBox); 

     if (itemContainer is ItemsControl) 
      list.AddRange(GetAllCheckBoxes(itemContainer)); 
    } 

    return list; 
} 

擴展方法添加到一個不同的,靜態類:

public static T GetChildOfType<T>(this DependencyObject depObj) 
    where T : DependencyObject 
{ 
    if (depObj == null) return null; 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
    { 
     var child = VisualTreeHelper.GetChild(depObj, i); 

     var result = (child as T) ?? GetChildOfType<T>(child); 
     if (result != null) return result; 
    } 

    foreach (var child in LogicalTreeHelper.GetChildren(depObj)) 
    { 
     if (child is DependencyObject) 
     { 
      var result = (child as T) ?? GetChildOfType<T>(child); 
      if (result != null) return result; 
     } 
    } 

    return null; 
} 
+0

不起作用。我只得到SiteMember的對象 - 綁定到treeVIew的類。我想得到dataTemplate,沒有類的對象。 –

+0

如果你做了'var itemContainer = itemsControl.ItemContainerGenerator.ContainerFromItem(item)',itemContainer就應該是一個TreeViewItem,並且CheckBox應該在它的內部(所以你應該可以用像GetChildOfType這樣的方法來找到它) 。但請記住,如果itemContainer的父級TreeViewItem未展開,則它可以是「null」。 – almulo

+0

我編輯了我的問題,我添加了圖片,看那裏。謝謝 –

0

試試這個,

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 


    private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     var test = FindVisualChildren<TreeViewItem>(tvEmps); 
     List<TreeViewItem> objtreeList = new List<TreeViewItem>(); 
     foreach (var item in test) 
     { 
      var chec = FindVisualChildren<CheckBox>(item as TreeViewItem).Cast<CheckBox>(); 
      if ((chec.FirstOrDefault() as CheckBox).IsChecked == true) 
      { 
       var textblock = FindVisualChildren<TextBlock>(item as TreeViewItem); 
      } 
     } 
    } 
+0

你並沒有在任何地方使用'GetLogicalChildCollection',我想你應該和'FindVisualChildren'一起使用它來獲得'TreeView'的所有孩子。 – almulo