如何访问数据网格模板列文本框文本 WPF C#

2023-12-25

我需要访问 a 中的文本DataGrid的模板列来自代码后面,但我不知道如何。我需要将文本更改为我在上传递给它的任何字符串SelectionChanged事件。有人可以告诉我如何实现这一目标吗?我发现了一个类似的问题here https://stackoverflow.com/questions/16997173/wpf-set-the-content-of-datagrids-selected-templatecolumns-textbox?noredirect=1#comment24557867_16997173但它没有答案。


要找到一个控件DataGrid模板列,您应该使用FindChild():

    public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
    {
        if (parent == null)
        {
            return null;
        }

        T foundChild = null;

        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);

        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            T childType = child as T;

            if (childType == null)
            {
                foundChild = FindChild<T>(child, childName);

                if (foundChild != null) break;
            }
            else
                if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;

                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        foundChild = (T)child;
                        break;
                    }
                    else
                    {
                        foundChild = FindChild<T>(child, childName);

                        if (foundChild != null)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    foundChild = (T)child;
                    break;
                }
        }

        return foundChild;
    }

例如我有这个模板列我的数据网格:

<DataGridTemplateColumn Width="1.5*" IsReadOnly="False">
    <DataGridTemplateColumn.Header>
        <TextBlock Text="Sample" ToolTip="{Binding Path=Text, RelativeSource={RelativeSource Self}}" FontSize="14" />
     </DataGridTemplateColumn.Header>

     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <TextBlock x:Name="MyTextBlock" Text="Hello!" />
         </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

从代码中访问它,您可以:

TextBlock MyTextBlock = FindChild<TextBlock>(MyDataGrid, "MyTextBlock");

MessageBox.Show(MyTextBlock.Text);

Note:仅当控件完全加载时才使用 FindChild,否则它将找不到它并给出 null。在本例中,我将此代码放入事件中内容呈现(Window) 表示窗口的所有内容已成功加载(即使事件 MyDataGrid_Loaded 也无法访问 MyTextBlock,因为它尚未加载):

    private void Window_ContentRendered(object sender, EventArgs e)
    {
        TextBlock MyTextBlock = FindChild<TextBlock>(MyDataGrid, "MyTextBlock");

        MessageBox.Show(MyTextBlock.Text);
    }

EDIT1:

访问所选行的控件以添加事件选择已更改 to DataGrid在其中运行,这将给出选定的行:

    private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            var row_list = GetDataGridRows(MyDataGrid);

            foreach (DataGridRow single_row in row_list)
            {
                if (single_row.IsSelected == true)
                {
                    TextBlock MyTextBlock = FindChild<TextBlock>(single_row, "MyTextBlock");

                    MessageBox.Show(MyTextBlock.Text);
                }
            }
        }

        catch 
        {
            throw new Exception("Can't get access to DataGridRow");
        }
    }

GetDataGridRows() 的列表:

    public IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
    {
        var itemsSource = grid.ItemsSource as IEnumerable;

        if (null == itemsSource)
        {
            yield return null; 
        }

        foreach (var item in itemsSource)
        {
            var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;

            if (null != row)
            {
                yield return row; 
            }
        }
    }

EDIT2:

To get ALL我重写了函数 FindChild() 的项目:

    public static void FindChildGroup<T>(DependencyObject parent, string childName, ref List<T> list) where T : DependencyObject
    {
        // Checks should be made, but preferably one time before calling.
        // And here it is assumed that the programmer has taken into
        // account all of these conditions and checks are not needed.
        //if ((parent == null) || (childName == null) || (<Type T is not inheritable from FrameworkElement>))
        //{
        //    return;
        //}

        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);

        for (int i = 0; i < childrenCount; i++)
        {
            // Get the child
            var child = VisualTreeHelper.GetChild(parent, i);

            // Compare on conformity the type
            T child_Test = child as T;

            // Not compare - go next
            if (child_Test == null)
            {
                // Go the deep
                FindChildGroup<T>(child, childName, ref list);
            }
            else
            {
                // If match, then check the name of the item
                FrameworkElement child_Element = child_Test as FrameworkElement;

                if (child_Element.Name == childName)
                {
                    // Found
                    list.Add(child_Test);
                }

                // We are looking for further, perhaps there are
                // children with the same name
                FindChildGroup<T>(child, childName, ref list);
            }
        }

        return;
    }

调用这个新函数:

   private void Window_ContentRendered(object sender, EventArgs e)
   {
        // Create the List
        List<TextBlock> list = new List<TextBlock>();

        // Find all elements
        FindChildGroup<TextBlock>(MyDataGrid, "MyTextBlock", ref list);
        string text = "";

        // Print
        foreach (TextBlock elem in list)
        {
            text += elem.Text + "\n";
        }

        MessageBox.Show(text, "Text in TextBlock");
   }

一般来说,这种做法不是最好的......要获取项目(例如全部或选定的),您可以直接联系存储您数据的列表(例如可观察集合)。此外,还有一些有用的事件,例如属性变更.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问数据网格模板列文本框文本 WPF C# 的相关文章

  • 最小化图像的内存消耗列表框(WPF)

    I have listbox which bind to ObservableCollection and take filename to display images 我的xaml是
  • WPF 中与 ControlPaint.Light 等效的是什么?

    与 ControlPaint Light 等效的 wpf 是什么 http msdn microsoft com en us library 3wz9t9fy 28VS 80 29 aspx http msdn microsoft com
  • WPF 动画:如何使其滑入?

    所以我刚刚进入动画领域 我想做一个 滑出 动画 我成功地做到了 但现在我希望它通过单击同一个按钮滑入 就像我单击它 它滑出 然后我希望当我再次单击它时它滑回 后面没有任何代码 所以只需通过 xaml 这是 XAML
  • WPF 按钮单击事件不起作用

    我有一个按钮 其中包含网格内的图像 我的问题是我无法制作该按钮Click活动工作 我的 XAML 代码
  • 使用引用的 ItemsSource 绑定到 SelectedItem

    Intro 我有一个不同的数据源池 我有口罩 面具有索引线 每个 Indexline 都有一个来自关联池的数据源 Classes public class DataSource public string Name get set publ
  • C# WPF 如何正确关闭新窗口?

    我有一个简单的问题 1 创建一个新的WPF项目 其中有启动窗口 MainWindow xaml 2 在此项目中 创建一个新窗口Window1 xaml 3 Windows1的已加载事件 让它关闭 4 放置一个Open按钮到MainWindo
  • TextBlock:Text与StringFormat的绑定

    是否可以绑定Text and StringFormat too
  • WPF 网络浏览器在 Adob​​e 阅读器窗口中打开 PDF 文件

    我正在创建一个 32 位 WPF 应用程序 它需要在 WebBrowser 控件中显示创建的 PDF 在做的同时 WebBrowser Navigate new Url D TestPDF MyDocument pdf 它在 Adob e
  • WPF 中 ToggleButton 的 IsChecked 属性的 OneWay 绑定

    我有一个ToggleButton以其IsChecked使用 OneWay 绑定将属性绑定到属性
  • 拖动用户控件,但将其保留在 WPF 中其父级的边界内

    我有一个用户控件 正在将其拖动到网格内 Z Index 设置得相当高 这样我就可以将其保持在其他孩子之上 拖动控件效果很好 但如果用户想要将控件移到网格之外 它会允许这样做 How do I keep it from leaving the
  • WPF 组合框如果只有 1 项则自动选择

    我有一个组合框 我绑定到一个可观察的集合 它会发生变化 根据选择的公司 并且大量公司将有一个帐户 项目 因此我想知道制作组合框的最佳方法是什么如果 ItemsSource 中只有 1 个项目 则设置 SelectedItem 否则将其保留为
  • TargetType="controlType" 和 TargetType="{x:Type controlType}" 之间的区别

    在 WPF 中 您可以设置TargetType类型的名称 或者您可以将其设置为 x Type nameOfType 有谁知道有什么区别 没有什么 由于属性类型是Type XAML 解析器知道尝试将您提供的任何内容转换为Type 在其他情况下
  • 如何在 WPF 中实现虚线或点线边框?

    我有一个ListViewItem我正在申请Style到 我想把灰色虚线作为底部Border 我怎样才能在 WPF 中做到这一点 我只能看到纯色画笔 这在我们的应用程序中效果很好 允许我们使用真正的边框而不是乱用矩形
  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 网格内的 ContentPresenter 可见性绑定不起作用?

    我有以下网格
  • 无法使用 DialogResult

    我尝试使用DialogResult检查一个Messagebox s 是 否 取消 我正在使用以下代码 我没有看到任何问题 DialogResult dlgResult MessageBox Show Save changes before
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 从 xaml 获取 RowIndex

    我有一个带有 DataGridTemplateColumns 的 DataGrid 在 TemplateColumn 中 我使用工作正常的 DataTrigger 它从 DataGrid 父级检索项目计数

随机推荐

  • 允许用户选择图像的相机或图库

    我想做的事情看起来很简单 但经过几天的搜索 我不太明白 我有一个应用程序 允许用户选择多个 最多 5 个 图像 我正在使用一个ImageView 当用户点击ImageView 我想让他们选择 从图库中选择图像 或 使用相机捕捉图像 我开始使
  • 拉伸div以填充body

    div style height 20px background color red div div style background color black div div style height 20px background col
  • Spark 客户端模式 - YARN 为驱动程序分配容器?

    我在客户端模式下在 YARN 上运行 Spark 因此我希望 YARN 仅为执行器分配容器 然而 从我所看到的来看 似乎还为驱动程序分配了一个容器 并且我没有得到与预期一样多的执行程序 我正在主节点上运行 Spark Submit 参数如下
  • JSTL 表达式语言访问对象属性

    我今天正在学习一个教程 这个教程让我摸不着头脑一个小时 考虑 public class MyClass public int getTotal amount 100 return amount 以及 JSP 的摘录 p Total obje
  • 万智牌数据库设计

    我想为我拥有的 MTG 卡创建一个数据库 设计会是什么样的 我想存储每张卡的以下信息 1 Name of card 2 Set the card belongs to 3 Condition of card 4 Price it sold
  • 位图插值c#

    网格尺寸 160 160 行数 列数 16 16 我为此创建了一个位图 网格的每个单元格都填充有不同的颜色 我需要执行颜色插值 我猜您想要执行以下操作 拍摄 16x16 像素图像并将其插值为 160x160 像素图像 以下是三个示例输出 您
  • 实现WebView数据库配额委托

    我如何实现这个方法 见下文 我是 Objective C 的新手 我只是不太了解它 From http lists apple com archives Webkitsdk dev 2008 Apr msg00027 html http l
  • 确定将在 php 中发送的 http 状态

    我正在尝试为管理应用程序标头的类编写一个测试用例 它发送的标头中有 http 状态标头 我正在使用 headers list 来查看将发送哪些标头 如果我现在发送标头的话 headers list 的问题是它不包含 http 状态标头 尽管
  • 为什么 lapply() 不保留我的 data.table 键?

    我的列表中有一堆 data tables 我要申请unique 到我的列表中的每个 data table 但这样做会破坏我的所有 data table 键 这是一个例子 A lt data table a rep c a b each 3
  • 这两组陈述之间的确切区别是什么?

    Set
  • 如何重新索引 pandas 数据透视表

    我创建了一个数据透视表 该表根据其中一列和时间索引的月份进行分组 这是数据透视表 AWRT AWFT AWDT Time type April All 38 190119 65 789103 27 598984 DHW 19 676627
  • 隐式、显式和流利等待之间的区别

    两者之间的确切区别是什么implicitwait explicitwait and fluentwait 您能举例说明吗 我已经发布关于此的博客文章 https medium com austenjt difference betwen i
  • 为什么 (x += x += 1) 在 C 和 Javascript 中的计算结果不同?

    如果变量的值x最初为 0 表达式x x 1在 C 中将计算为 2 在 Javascript 中将计算为 1 C 的语义对我来说似乎很明显 x x 1被解释为x x 1 反过来 这相当于 x 1 x x where x is 1 at thi
  • 在 Angular 6 工作区中安装 NPM 包

    我刚刚开始学习 Angular 6 和 CLI 并创建了一个项目 如下所示 ng new my demo cd my demo ng g library foo prefix my 我的库中没有我想要添加的内容ngx bootstrap因为
  • Scrapy Spider整理抓取过程,不刮任何东西

    我有一只蜘蛛 它会在亚马逊上抓取信息 蜘蛛读取一个 txt 文件 在其中写入它必须搜索的产品 然后进入该产品的亚马逊页面 例如 我使用 keywords laptop 来更改要搜索的产品等 我遇到的问题是蜘蛛无法工作 这很奇怪 因为一周前它
  • 软件开发中的测试人员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我的公司 我们开发一种软 件产品 到目前为止 我们还没有任何测试人员 所以基本上开发人员就是测试人员 当然还有客户和用户 不好 我们的团队现在
  • lsnrctl start rane 当我触发此命令时出现此错误

    oracle myserver lsnrctl start rane LSNRCTL for Linux Version 11 2 0 1 0 Production on 27 SEP 2016 23 04 58 Copyright c 1
  • 错误:无法解析“C:\projects\Project-CMS\Project.Web\src”中的“./app/app.module.ngfactory”

    当我为 Angular 5 应用程序创建构建时 出现以下错误 当我创建构建时它工作正常 ng build 当我创建 buildproductttion 时它显示错误 ng build prod 我没有在应用程序中的任何地方使用 ngfact
  • 关闭模态视图控制器时“[CALayer release]:消息发送到已释放的实例”

    这几天我一直在纠结这个问题 找不到解决办法 所以请教一下 我有两个 UIViewController NewPostUIViewController 和 SettingsUIViewController 在第二个中我有一个字段 id
  • 如何访问数据网格模板列文本框文本 WPF C#

    我需要访问 a 中的文本DataGrid的模板列来自代码后面 但我不知道如何 我需要将文本更改为我在上传递给它的任何字符串SelectionChanged事件 有人可以告诉我如何实现这一目标吗 我发现了一个类似的问题here https s