WPF怎么寻找在ItemTemplate内部的各种控件
有如下控件
<Grid> <ListBox x:Name="lb"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox x:Name="ck"></CheckBox> <TextBlock x:Name="tb" Text="{Binding StuId}"></TextBlock> <TextBlock Text="{Binding StuName}"></TextBlock> <TextBlock Text="{Binding Sex}"></TextBlock> <TextBlock Text="{Binding Pwd}"></TextBlock> <Button Content="修改" Width="100" Height="30"></Button> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <Button Content="Show" Width="100" Height="30" Click="Button_Click"></Button> </Grid>
现要知道CheckBox是否选中,但是它是DataTemplate内部的控件,要如何访问到呢,MSDN上这样做的
http://msdn.microsoft.com/zh-cn/library/bb613579(v=vs.100).aspx
所以方法如下
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is childItem) return (childItem)child; else { childItem childOfChild = FindVisualChild<childItem>(child); if (childOfChild != null) return childOfChild; } } return null; } private void Button_Click(object sender, RoutedEventArgs e) { ListBoxItem lbitem = null; ContentPresenter myContentPresenter = null; DataTemplate myDataTemplate = null; CheckBox ck = null; TextBlock tb = null; for (int i = 0; i < lb.Items.Count; i++) { lbitem = (ListBoxItem)(lb.ItemContainerGenerator.ContainerFromItem(lb.Items[i])); myContentPresenter = FindVisualChild<ContentPresenter>(lbitem); myDataTemplate = myContentPresenter.ContentTemplate; ck = (CheckBox)myDataTemplate.FindName("ck", myContentPresenter) as CheckBox; if (ck.IsChecked == true) { tb = (TextBlock)myDataTemplate.FindName("tb", myContentPresenter) as TextBlock; MessageBox.Show(tb.Text); } } }
功能实现...
今天又遇到一个不一样的,DataGrid
好吧,上源代码
<DataGrid x:Name="dataGrid5" AutoGenerateColumns="False" AlternatingRowBackground="LightSteelBlue" RowBackground="Azure" IsReadOnly="True"> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox x:Name="ck"></CheckBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding StuName}"></TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="StuName"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <TextBlock Padding="5,0,5,0" Text="{Binding Resume}"/> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <TextBlock Padding="5,0,5,0" Text="{Binding Resume}"/> </StackPanel> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
不错,我们要找的就是ck这个控件,并根据他是否选中来做一些业务处理,我主要是遍历,要获取某一行的checkbox是否被选中,请看这里http://blog.sina.com.cn/s/blog_541e699d0100wjs9.html
DataGridTemplateColumn _dataTemplate = dataGrid5.Columns[0] as DataGridTemplateColumn; FrameworkElement element = null; CheckBox ck=null; for (int i = 0; i < dataGrid5.Items.Count-1; i++) { element = _dataTemplate.GetCellContent(dataGrid5.Items[i]); ck=_dataTemplate.CellTemplate.FindName("ck",element) as CheckBox; if (ck.IsChecked == true) { MessageBox.Show(string.Format("StuName:{0}",(dataGrid5.Items[i] as Stu).StuName)); } }
ok,又搞定...