我有一个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的回答,我几乎得到了它。 我有这个:
我想要获取内容(右边标记为红色),但我还没有孩子。内容
答案 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);
}
}
}