在树视图中获取所有选定的项目
get all selected item in treeview
你好,我有一个 treeview,它的 itemtemplate 是复选框。我想获取选中的项目 ischecked = true
我该怎么做?
我想获取列表中所有选中的项目。有些项目可能有子项目
<TreeView x:Name="chkTree" ItemsSource="{Binding TreeRoot}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType = "{x:Type local:CheckTreeSource}" ItemsSource = "{Binding Children}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
更新:
我试过了,但只有当一个项目被选中时才有效,但是如果只有子项目被选中(项目本身没有被选中,只有它的一些子项目)这段代码不起作用
foreach (var item in chkTree.Items)
{
if (((CheckTreeSource)item).IsChecked== true && ((CheckTreeSource)item).Children !=null)
{
foreach (var subitem in ((CheckTreeSource)item).Children)
{
MessageBox.Show(((CheckTreeSource)subitem).Text + "");
}
}
}
您可以使用静态方法递归地将选中的项目添加到集合中:
public static void AddCheckedItems(
CheckTreeSource item, ICollection<CheckTreeSource> checkedItems)
{
if (item.IsChecked)
{
checkedItems.Add(item);
}
if (item.Children != null)
{
foreach (var childItem in item.Children)
{
AddCheckedItems(childItem, checkedItems); // recursive call
}
}
}
然后以根项作为开始调用它:
var checkedItems = new List<CheckTreeSource>();
AddCheckedItems(TreeRoot, checkedItems);
或者在 CheckTreeSource 中声明方法 class:
public void AddCheckedItems(ICollection<CheckTreeSource> checkedItems)
{
if (IsChecked)
{
checkedItems.Add(this);
}
if (Children != null)
{
foreach (var childItem in Children)
{
childItem.AddCheckedItems(checkedItems);
}
}
}
并这样称呼它:
var checkedItems = new List<CheckTreeSource>();
TreeRoot.AddCheckedItems(checkedItems);
您可能还想看看这个:
你好,我有一个 treeview,它的 itemtemplate 是复选框。我想获取选中的项目 ischecked = true
我该怎么做?
我想获取列表中所有选中的项目。有些项目可能有子项目
<TreeView x:Name="chkTree" ItemsSource="{Binding TreeRoot}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType = "{x:Type local:CheckTreeSource}" ItemsSource = "{Binding Children}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
更新:
我试过了,但只有当一个项目被选中时才有效,但是如果只有子项目被选中(项目本身没有被选中,只有它的一些子项目)这段代码不起作用
foreach (var item in chkTree.Items)
{
if (((CheckTreeSource)item).IsChecked== true && ((CheckTreeSource)item).Children !=null)
{
foreach (var subitem in ((CheckTreeSource)item).Children)
{
MessageBox.Show(((CheckTreeSource)subitem).Text + "");
}
}
}
您可以使用静态方法递归地将选中的项目添加到集合中:
public static void AddCheckedItems(
CheckTreeSource item, ICollection<CheckTreeSource> checkedItems)
{
if (item.IsChecked)
{
checkedItems.Add(item);
}
if (item.Children != null)
{
foreach (var childItem in item.Children)
{
AddCheckedItems(childItem, checkedItems); // recursive call
}
}
}
然后以根项作为开始调用它:
var checkedItems = new List<CheckTreeSource>();
AddCheckedItems(TreeRoot, checkedItems);
或者在 CheckTreeSource 中声明方法 class:
public void AddCheckedItems(ICollection<CheckTreeSource> checkedItems)
{
if (IsChecked)
{
checkedItems.Add(this);
}
if (Children != null)
{
foreach (var childItem in Children)
{
childItem.AddCheckedItems(checkedItems);
}
}
}
并这样称呼它:
var checkedItems = new List<CheckTreeSource>();
TreeRoot.AddCheckedItems(checkedItems);
您可能还想看看这个: