WPF如何在代码中访问DataGridTemplateColumn中的子元素?
解决WPF DataGridTemplateColumn中控件切换显示的问题
嘿,作为WPF新手遇到这种控件查找的问题太正常了!你之前的方法没成功,核心原因是找错了对象——DataGridTemplateColumn里的DataTemplate只是个模板定义,实际运行时每个单元格里的TextBlock、TextBox都是模板实例化出来的,它们不在列的视觉树里,而是属于具体的单元格。
给你一个简单又靠谱的解决方案,从点击的Button出发,一步步找到要操作的控件:
修改后的点击事件代码
private void UserCodeButton_Click(object sender, RoutedEventArgs e) { // 先拿到被点击的Button var clickBtn = sender as Button; if (clickBtn == null) return; // 找到Button的父容器StackPanel(就是你XAML里的UserCodeStack) var parentStack = clickBtn.Parent as StackPanel; if (parentStack == null) return; // 从StackPanel里找出对应的TextBlock和TextBox var codeTextBlock = parentStack.FindName("UserCodeTextBlock") as TextBlock; var codeTextBox = parentStack.FindName("UserCodeTextBox") as TextBox; // 切换控件的可见性 codeTextBlock.Visibility = Visibility.Collapsed; clickBtn.Visibility = Visibility.Collapsed; codeTextBox.Visibility = Visibility.Visible; MessageBox.Show(Properties.Resources.CodeChanged, "", MessageBoxButton.OK); }
为啥这个方法能行?
sender就是触发点击的Button,直接转换比用e.Source更直接可靠- Button的
Parent就是XAML里的StackPanel,因为它们是直接的父子布局关系 FindName方法能在当前容器的命名范围内找到模板里定义的控件,比递归遍历整个视觉树高效多了,也更适合你的场景
给新手的进阶小建议(可选)
如果以后想更贴合WPF的设计思想,可以试试MVVM模式:
- 给你绑定的数据对象加一个
IsEditing布尔属性 - 把三个控件的
Visibility绑定到这个属性,用BooleanToVisibilityConverter来实现显示/隐藏的转换 - Button的点击事件换成命令,触发
IsEditing属性的切换
这样就不用在后台代码里找控件,完全用数据驱动UI,不过对于刚入门的你,先把上面的方法搞明白就足够解决当前问题啦!
内容的提问来源于stack exchange,提问作者Ginjo
相关产品推荐
相关产品推荐

