C# 从treeView c获取项目#

C# 从treeView c获取项目#,c#,wpf,treeview,treeviewitem,hierarchicaldatatemplate,C#,Wpf,Treeview,Treeviewitem,Hierarchicaldatatemplate,我有一个树景 <TreeView Name="files" Margin="0,0,569,108" Grid.Row="1" ItemsSource="{Binding s1}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Members}" > <StackPanel Orientation="Hori

我有一个树景

<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>
但我无法访问复选框。。。我不知道如何获得它

多谢各位

编辑:我尝试了阿尔穆洛的答案,我几乎得到了。 我有这个:

我想访问内容(右侧红色标记),但我没有孩子。内容

请尝试以下代码

 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);
            }
公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
for(int i=0;i
试试这个代码

 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);
            }
公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
for(int i=0;i
首先,使用代码只能访问所有项目的第二级。也许在你的例子中这就足够了,但是我会让这个方法递归,这样它就可以适用于任何深度的树

我也使用扩展方法查找实际控件,因此即使复选框嵌套在容器中或放置在其他控件中,它也可以工作

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;
}
private void allfiles复选框\u选中(对象发送方,路由目标)
{
var checkbox=getAllcheckbox(文件);
foreach(复选框中的var复选框)
{
//用复选框做一些事情
}
}
私有列表GetAllCheckBox(ItemsControl ItemsControl)
{
var list=新列表();
foreach(itemsControl.Items中的变量项)
{
var itemContainer=itemsControl.ItemContainerGenerator.ContainerFromItem(item);
var checkBox=itemContainer.GetChildOfType();
如果(复选框!=null)
列表。添加(复选框);
如果(itemContainer是ItemsControl)
AddRange(getAllCheckBox(itemContainer));
}
退货清单;
}
将扩展方法添加到其他静态类:

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;
}
public static T GetChildOfType(此DependencyObject depObj)
其中T:DependencyObject
{
if(depObj==null)返回null;
for(int i=0;i
首先,使用代码只能访问所有项目的第二级。也许在你的例子中这就足够了,但是我会让这个方法递归,这样它就可以适用于任何深度的树

我也使用扩展方法查找实际控件,因此即使复选框嵌套在容器中或放置在其他控件中,它也可以工作

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;
}
private void allfiles复选框\u选中(对象发送方,路由目标)
{
var checkbox=getAllcheckbox(文件);
foreach(复选框中的var复选框)
{
//用复选框做一些事情
}
}
私有列表GetAllCheckBox(ItemsControl ItemsControl)
{
var list=新列表();
foreach(itemsControl.Items中的变量项)
{
var itemContainer=itemsControl.ItemContainerGenerator.ContainerFromItem(item);
var checkBox=itemContainer.GetChildOfType();
如果(复选框!=null)
列表。添加(复选框);
如果(itemContainer是ItemsControl)
AddRange(getAllCheckBox(itemContainer));
}
退货清单;
}
将扩展方法添加到其他静态类:

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;
}
public static T GetChildOfType(此DependencyObject depObj)
其中T:DependencyObject
{
if(depObj==null)返回null;
for(int i=0;i
试试这个

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);
            }
        }
    }
公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
为了(