2015-03-31 2 views
0

У меня есть такой шаблонНабор Связующие для элементов DataTemplate в программно

<Window.Resources> 
    <DataTemplate x:Key="MemberCoefDataTemplate"> 
     <StackPanel> 
      <CheckBox Name="CheckBox"></CheckBox> 
      <TextBox Name="TextBox"></TextBox> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

И я использую его в сетке

<DataGridTemplateColumn CellTemplate="{StaticResource MemberCoefDataTemplate}" /> 

Мне нужно динамически добавлять столбцы сетки. В качестве привязки я использую свойство indexer. Поэтому мне нужно установить привязку динамически, потому что я не знаю, к какому индексу привязан. Когда я только для теста попробовал этот

var column = new DataGridTemplateColumn(); 
column.CellTemplate = (DataTemplate)Application.Current.MainWindow.Resources["MemberCoefDataTemplate"]; 
TextBox tb = column.CellTemplate.FindName("TextBox", dg) as TextBox; 

Я получил InvalidOperationException описание остроумие:

эта операция действительна только на элементах, которые этот шаблон применяется

ответ

0

Обычно, чтобы получить контроль во время время установки, вам нужно будет позвонить по методу LoadContent();

Я бы поэтому попробовал column.CellTemplate.LoadContent().

+0

спасибо, но это не устраняет проблему. – Yola

0

Вы можете найти полное объяснение своей проблемы (и, конечно же, решение), написанное Джошем Смитом here в своем блоге.

Действительно, это та точка, где DataGridTemplateColumn применяет DataTemplate:

private FrameworkElement LoadTemplateContent(bool isEditing, object dataItem, DataGridCell cell) 
{ 
    DataTemplate dataTemplate; 
    DataTemplateSelector dataTemplateSelector; 
    this.ChooseCellTemplateAndSelector(isEditing, out dataTemplate, out dataTemplateSelector); 
    if (dataTemplate != null || dataTemplateSelector != null) 
    { 
     ContentPresenter contentPresenter = new ContentPresenter(); 
     BindingOperations.SetBinding(contentPresenter, ContentPresenter.ContentProperty, new Binding()); 
     contentPresenter.ContentTemplate = dataTemplate; 
     contentPresenter.ContentTemplateSelector = dataTemplateSelector; 
     return contentPresenter; 
    } 
    return null; 
} 

Как вы можете видеть, ContentPresenter используется.

Смежные вопросы