【问题标题】:Accessing DataGridTemplateColumn访问 DataGridTemplateColumn
【发布时间】:2014-01-20 10:12:46
【问题描述】:

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

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

(我直接写到&lt;DataGrid.columns&gt;元素中)

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 很陌生,所以如果您的代码中有其他 cmets - 请说出来)

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

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

    看看这个:

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

    【讨论】:

      【解决方案2】:

      从技术上讲,您应该有一些ICommand 的实现,将Button.Command 绑定到您的 ViewModel 并在那里做您想做的事情,但是如果您坚持这样做,那么您可以通过sender 访问DataConextButton_browse_alert_program

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多