情况2:当没有设定DataTemplate的Name或是以Resource方式调用时,获取DataTemplate里的指定控件。
方法:
1、这里需要有一个从DataTemplate里获取控件的函数
-
-
-
public T FindFirstVisualChild<T>(DependencyObject obj, string childName) where T : DependencyObject
-
{
-
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
-
{
-
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
-
if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
-
{
-
return (T)child;
-
}
-
else
-
{
-
T childOfChild = FindFirstVisualChild<T>(child, childName);
-
if (childOfChild != null)
-
{
-
return childOfChild;
-
}
-
}
-
}
-
return null;
-
}
-
2、
-
-
-
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1">
-
<ItemsControl.ItemsPanel>
-
<ItemsPanelTemplate>
-
<WrapPanel Orientation="Horizontal"/>
-
</ItemsPanelTemplate>
-
</ItemsControl.ItemsPanel>
-
<ItemsControl.ItemTemplate>
-
<DataTemplate>
-
<Border Padding="3">
-
<WrapPanel>
-
<TextBox x:Name="txtID"/>
-
<TextBlock x:Name="txtName" Text="Good"/>
-
</WrapPanel>
-
</Border>
-
</DataTemplate>
-
</ItemsControl.ItemTemplate>
-
</ItemsControl>
-
或者
-
-
-
<Page.Resource>
-
<DataTemplate x:Key="data">
-
<Border Padding="3">
-
<WrapPanel>
-
<TextBox x:Name="txtID"/>
-
<TextBlock x:Name="txtName" Text="Good"/>
-
</WrapPanel>
-
</Border>
-
</DataTemplate>
-
</Page.Resources>
-
-
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1" ItemTemplate="{StaticResource data}">
-
<ItemsControl.ItemsPanel>
-
<ItemsPanelTemplate>
-
<WrapPanel Orientation="Horizontal"/>
-
</ItemsPanelTemplate>
-
</ItemsControl.ItemsPanel>
-
</ItemsControl>
-
3、解下来就写按钮的处理函数:
我需要获取DataTemplate里名为"txtName"的TextBlock控件并显示他的Text内容。
private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { TextBlock txt = FindFirstVisualChild<TextBox>(itemsControl, "txtName"); if (txt != null)//判断是否找到 MessageBox.Show(txt.Text.ToString()); }
-
情况3:当没有设定DataTemplate的里的控件Name或者你压根不知道里面有哪些控件,但是你又想获取他们的值时。例如上一篇,当我动态生成CheckBox后,我想知道哪些CheckBox被选中了。
方法:
1、也需要一个获取DataTemplate控件的函数,但是返回的是一个集合。
-
-
-
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
-
{
-
DependencyObject child = null;
-
List<T> childList = new List<T>();
-
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
-
{
-
child = VisualTreeHelper.GetChild(obj, i);
-
if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
-
{
-
childList.Add((T)child);
-
}
-
childList.AddRange(GetChildObjects<T>(child, ""));//指定集合的元素添加到List队尾
-
}
-
return childList;
-
}
-
2、xaml中代码(详细请看前一篇)
-
-
-
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1">
-
<ItemsControl.ItemsPanel>
-
<ItemsPanelTemplate>
-
<WrapPanel Orientation="Horizontal"/>
-
</ItemsPanelTemplate>
-
</ItemsControl.ItemsPanel>
-
<ItemsControl.ItemTemplate>
-
<DataTemplate>
-
<Border Padding="3">
-
<WrapPanel>
-
<CheckBox Content="{Binding txt}"/>
-
</WrapPanel>
-
</Border>
-
</DataTemplate>
-
</ItemsControl.ItemTemplate>
-
</ItemsControl>
-
3、解下来就写按钮的处理函数
-
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
-
{
-
DataVisualTreeHelper VTHelper = new DataVisualTreeHelper();
-
List<CheckBox> collection = VTHelper.GetChildObjects<CheckBox>(itemsControl, "")//第2个参数为空,表示查找所有指定类型的控件(返回
-
-
一个CheckBox集合)
-
foreach (CheckBox item in collection //遍历这个集合
-
{
-
if (item.IsChecked == true)
-
MessageBox.Show(item.Content.ToString() + "被选中了!");
-
}
-
}
-