从treeView获取项目c#

时间:2015-06-29 09:07:11

标签: c# wpf treeview treeviewitem hierarchicaldatatemplate

我有一个TreeView

<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>

我想检查代码隐藏中的所有复选框:

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;
       }
   }
}

但我无法访问checkBox ...我不知道如何访问它。

谢谢。

编辑:我尝试了almulo的回答,我几乎得到了它。 我有这个:

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

我想要获取内容(右边标记为红色),但我还没有孩子。内容

3 个答案:

答案 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);
            }

答案 1 :(得分: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;
}

答案 2 :(得分: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);
            }
        }
    }