C# 访问DataGridTemplateColumn

C# 访问DataGridTemplateColumn,c#,wpf,datagrid,C#,Wpf,Datagrid,我试图在数据网格中找到一条路径。我编写了以下数据模板: <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition W

我试图在数据网格中找到一条路径。我编写了以下数据模板:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="auto" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding AlertProgram}" IsEnabled="False" Grid.Column="0" />
                <Button Content="..." Grid.Column="1" Click="Button_browse_alert_program" />
            </Grid>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

(我把它直接写进了
元素)

在功能
按钮\u浏览\u警报\u程序中
我打开一个OpenFile对话框以获取文件

我的问题是-我无法访问文本框。我尝试使用
x:name=“someName”
为它命名,但编译器抱怨该名称不存在

我看到了以下问题:

没有第三方软件,也没有编写自己的
FindChild
函数,有没有办法做到这一点


(我对WPF很陌生,因此如果您对我的代码有其他意见,请大声说出来)

从技术上讲,您应该有一些
ICommand
的实现,将
Button.Command
绑定到您的ViewModel并在其中执行您想要的操作,但如果您固定使用这种方式,则可以通过
Button\u browse\u alert\u程序中的
sender
访问
DataConext

private void Button_browse_alert_program(object sender, RoutedEventArgs e)
{
   var value = ((sender as Button).DataContext as MyItemClass).AlertProgram;
}

你为什么要这么做?为什么是第三方软件

看看这个:

    <DataGrid x:Name="dG">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="auto" />
                            </Grid.ColumnDefinitions>
                            <TextBox x:Name="tbx">test</TextBox>
                            <Button Content="click me" Grid.Column="1" Click="OnClick" />
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
        <DataGrid.ItemsSource>
            test
        </DataGrid.ItemsSource>
    </DataGrid>
    private void OnClick(object sender, RoutedEventArgs e)
    {
        TextBox tbx = null;
        // grid is a panel, panels have children
        var parent = VisualTreeHelper.GetParent((DependencyObject)sender) as Panel;
        foreach(var child in parent.Children)
        {
            if (child is TextBox)
            {
                tbx = (TextBox)child;
                break;
            }
        }

        // you should check if tbx != null
        tbx.Text = "Hello";
    }