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)
{
为了(