2012-12-30 42 views
0

我想访问一个控件,它位于代码后面的datagrid控件的控件模板中。如何访问数据网格中的模板控件?

myxaml.xaml:

<DataGrid > 
. 
. 
. 
<DataGridTemplateColumn x:Name="discountGridTextcolumn" > 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBox Name="discountText"/> 
      <ComboBox x:Name="discountType"/> 
     </StackPanel> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 
. 
. 
. 

mybehind.cs:

var comboBox = GetTemplateChild("discountType"); 

我得到空引用。

+0

你到底想干什么? – Ramin

回答

1

如果返回null,则必须将它们放置在OnApplyTemplate()方法: 例如

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    var comboBox = GetTemplateChild("discountType") as ComboBox; 
} 

也可以尝试这个How to access Control Template parts from Code Behind

更新

How to: Find DataTemplate-Generated Elements:

DataGridRow row = (DataGridRow)(yourgrid.ItemContainerGenerator.ContainerFromItem(yourgrid.SelectedItem)); 
DataGridDetailsPresenter presenter = FindVisualChild<DataGridDetailsPresenter>(row); 
DataTemplate template = presenter.ContentTemplate; 
ComboBox Com= (ComboBox)template.FindName("discountType", presenter); 

FindVisualChild功能:

private childItem FindVisualChild<childItem>(DependencyObject obj) 
    where childItem : DependencyObject 
{ 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
     if (child != null && child is childItem) 
      return (childItem)child; 
     else 
     { 
      childItem childOfChild = FindVisualChild<childItem>(child); 
      if (childOfChild != null) 
       return childOfChild; 
     } 
    } 
    return null; 
} 

另一种解决方案How to access objects (comboBox, TextBox...) in DataTemplate

+0

控件位于DataTemplate中。你确定它有效吗? – Ramin

+0

@ Ramin:我以前没有尝试过,但我想工作。 – KF2

+0

@irsog这段代码也返回null值。 –

相关问题