2014-01-20 35 views
0

我想在数据网格中有一个路径。我写了下面的数据模板:访问DataGridTemplateColumn

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

在功能Button_browse_alert_program我打开一个打开文件对话框,以获取文件。

我的问题是 - 我无法访问文本框。我试着用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,所以如果你有在我的代码的其他意见 - 说话)

回答

0

通过sender访问DataConext为什么你会做这些?为什么选择第三方软件?

看看这个:

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

从技术上讲,你应该有一些ICommand实施,结合Button.Command你的视图模型,做你想要什么有,但如果你固定在做这种方式,那么你可以在Button_browse_alert_program

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