您的位置:首页 > 其它

WPF怎么寻找在ItemTemplate内部的各种控件

2013-03-25 23:34 423 查看
有如下控件

<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,又搞定...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: