【问题标题】:Get a control from DataGridTextColumn without searching through the whole DataGrid children从 DataGridTextColumn 获取控件而不搜索整个 DataGrid 子项
【发布时间】:2018-07-14 10:42:28
【问题描述】:

我在数据网格标题中有一个文本框。

我试图在单击页面其他地方的完全不相关的按钮时获取其内容(无法使用 selectedItem)。

能够使用下面的代码实现它。

XAML:

<DataGrid Name="dataGrid">
    <DataGrid.Columns>
         <DataGridTextColumn  Header="Name" >
             <DataGridTextColumn.HeaderTemplate >
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>      
                        <TextBox Name="txtName"/>                                                                 
                    </StackPanel>
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
       </DataGridTextColumn>
   </DataGrid.Columns>
</DataGrid>

C#:

TextBox MyTextbox = FindChild<TextBox>(dataGrid, "txtName");
MessageBox.Show(MyTextbox.Text);

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;
    }

通过使用上述方法,我可以从模板中获取文本框“txtName”。但我担心如果列越多,数据越多,搜索就会变得繁重。

我试图找到包含标题的行,以便只能在该行上运行搜索,但没有成功。

有没有更好更有效的方法来做同样的事情?

【问题讨论】:

    标签: c# wpf datagrid wpfdatagrid datagridtextcolumn


    【解决方案1】:

    如果您只需要获取TextBox 的文本,您可以对TextBox 进行数据绑定:

    <TextBox Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                            AncestorType={x:Type local:MyWindow}},
                                            Path=TheTextBoxValue}"/>   
    

    此示例假定网格在 XAML local 命名空间中有一个名为 MyWindow 的祖先,并且此窗口有一个名为 TheTextBoxValue 的字符串值属性。

    然后,您始终可以访问TextBox 的值,而无需搜索DataGrid 的逻辑树。

    【讨论】:

    • 感谢您的回答。由于我有多个专栏,我认为这种方法会有点困难。有没有办法将文本绑定到类中的变量?
    • “变量”是指 C# 字段吗?无法绑定到字段;您只能绑定到依赖属性或普通 C# 属性。
    • 我能够将文本绑定到我父类中的字符串。公共字符串 TheTextBoxValue{ 获取;放; }。谢谢!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多