访问DataGridTemplateColumn

时间:2014-01-20 10:12:47

标签: c# wpf datagrid

我正在尝试在数据网格中设置路径。我写了以下数据模板:

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

(我直接将其写入<DataGrid.columns>元素)

在函数Button_browse_alert_program中,我打开一个OpenFileDialog来获取文件。

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

我看到了以下SO问题:How to access datagrid template column textbox text WPF C#How to access control in DataGridTemplateColumn to get value?

如果没有第三方软件,并且没有编写我自己的FindChild功能,有没有办法做到这一点?

(我对WPF很新,所以如果你对我的代码有其他意见 - 说出来)

2 个答案:

答案 0 :(得分:0)

从技术上讲,你应该有一些ICommand的实现,将Button.Command绑定到你的ViewModel并在那里做你想做的事情但是如果你这样修复它就可以访问{{1在DataConext

中通过sender
Button_browse_alert_program

答案 1 :(得分:0)

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

看看这个:

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