You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取WPF中DataGrid模板列内TextBlock的文本值?

解决DataGrid模板列中TextBlock文本值获取问题

方案1:数据绑定(推荐,符合WPF设计思想)

不要直接操作UI元素,而是通过数据绑定将TextBlock的文本与数据模型关联,直接从模型取值更可靠,也符合WPF的设计理念。

修改XAML代码

给DataGrid绑定数据源,同时将TextBlock的Text绑定到数据模型的属性:

<Grid>
    <GroupBox FontSize="16" FontWeight="Bold" Header="Testing" 
              BorderBrush="Orange" BorderThickness="3">
        <!-- 绑定到ViewModel的Items集合 -->
        <DataGrid Background="Transparent" ItemsSource="{Binding Items}">
            <DataGrid.Columns>
                <DataGridTemplateColumn Width="Auto">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Grid IsEnabled="True" Background="Transparent">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <!-- 绑定到数据模型的Text属性 -->
                                <TextBlock Text="{Binding Text}" Width="50" 
                                           HorizontalAlignment="Center" VerticalAlignment="Center" 
                                           ToolTipService.ToolTip="Testing" Background="Aqua" 
                                           ToolTipService.IsEnabled="True" 
                                           ToolTipService.ShowOnDisabled="True" 
                                           IsEnabled="True" Height="20" >
                                </TextBlock>
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </GroupBox>
</Grid>

定义数据模型与ViewModel

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Collections.ObjectModel;

public class MyItem : INotifyPropertyChanged
{
    private string _text;
    public string Text
    {
        get => _text;
        set
        {
            _text = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

// ViewModel示例
public class MainViewModel
{
    public ObservableCollection<MyItem> Items { get; set; } = new ObservableCollection<MyItem>();

    public MainViewModel()
    {
        // 初始化示例数据
        Items.Add(new MyItem { Text = "Hello" });
    }
}

获取文本值

直接从选中的数据项中读取属性:

// 假设dataGrid是你的DataGrid控件实例
if (dataGrid.SelectedItem is MyItem selectedItem)
{
    string textValue = selectedItem.Text;
    // 处理获取到的文本值
}

方案2:遍历可视化树查找UI元素

如果必须直接操作UI元素,可通过递归遍历可视化树找到目标TextBlock。注意:此方法不推荐,因为DataGrid有UI虚拟化,未显示的行不会生成UI元素,且直接操作UI违背MVVM理念,维护性差。

第一步:给TextBlock命名

在XAML中给目标TextBlock添加x:Name:

<TextBlock x:Name="TargetTextBlock" Text="Hello" ... />

第二步:编写可视化树查找方法

using System.Windows;
using System.Windows.Media;

public static T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        if (child is T typedChild)
            return typedChild;

        var foundChild = FindVisualChild<T>(child);
        if (foundChild != null)
            return foundChild;
    }
    return null;
}

第三步:获取指定行的TextBlock文本

// 获取选中行的TextBlock文本
if (dataGrid.SelectedItem != null)
{
    DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.SelectedItem);
    if (row != null)
    {
        // 获取模板列对应的单元格
        DataGridCell cell = dataGrid.Columns[0].GetCellContent(row).Parent as DataGridCell;
        if (cell != null)
        {
            TextBlock textBlock = FindVisualChild<TextBlock>(cell);
            if (textBlock != null)
            {
                string textValue = textBlock.Text;
                // 处理获取到的文本值
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者R-T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:51:03