【问题标题】:get item from treeView c#从treeView c#中获取项目
【发布时间】:2015-06-29 09:07:11
【问题描述】:

我有一个树视图

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

但我无法访问复选框...我不知道如何访问它。

谢谢。

编辑:我尝试了 almulo 的答案,我几乎明白了。 我有这个:

我想获取内容(右侧标记为红色),但我没有 child.Content

【问题讨论】:

  • 你有很多复选框吗?

标签: c# wpf treeview treeviewitem hierarchicaldatatemplate


【解决方案1】:

试试这个代码,

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

【讨论】:

  • 我编辑了我的问题,并添加了图片,看那里。谢谢
【解决方案2】:

首先,您的代码只能访问所有项目的第二级。也许在你的情况下这已经足够了,但我会让方法递归,所以它适用于任何深度的任何树。

我也使用扩展方法来查找实际控件,因此即使 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;
}

【讨论】:

  • 不工作。我得到的只是 SiteMember 的对象——绑定到 treeVIew 的类。我想得到dataTemplate,没有类的对象。
  • 如果你使用var itemContainer = itemsControl.ItemContainerGenerator.ContainerFromItem(item),那么itemContainer 应该是一个TreeViewItem,并且CheckBox 应该在其中(所以你应该能够使用GetChildOfType 之类的方法找到它)。但请记住,如果 itemContainer 的父 TreeViewItem 未展开,则它可能是 null
  • 我编辑了我的问题,并添加了图片,看那里。谢谢
  • 我在 GetChildOfType 扩展方法中添加了对逻辑子项的搜索。这应该可以帮助您找到复选框。
  • 不,当 depObj 是正确的元素时,作为我在图片中给出的模式,它到达了第二个循环,但他的孩子不是 DependencyObject...而且它不是没有得到进入if。
【解决方案3】:

试试这个,

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

【讨论】:

  • 你没有在任何地方使用GetLogicalChildCollection,我猜你想和FindVisualChildren一起使用它来获取TreeView的所有孩子。
猜你喜欢
  • 2021-12-22
  • 2011-07-10
  • 2012-05-23
  • 2015-08-17
  • 2015-06-16
  • 2016-11-20
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多