2014-09-04 3 views
0

Основной концепцией было бы, когда пользователь нажимает кнопку запуска и новый список возвращается из рабочего потока, он будет добавлен в «список списков», чем будет отображаться во вновь созданной вкладке. Однако я не могу показаться, чтобы захватить DataGrid на вновь созданный TabItem ..... все еще не мог выяснял, FindName и все методы судилиBind TabItem to List

XAML

<TabControl x:Name="tabMain" Margin="8,63,10,10" IsSynchronizedWithCurrentItem="True" > 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <Grid x:Name="grMain" Background="#FFE5E5E5"> 
       <DataGrid x:Name="dgResults" IsReadOnly="True" AutoGenerateColumns="False" AlternatingRowBackground="#FFAAE8D5" ItemsSource="{Binding data}" > 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Key" Binding="{Binding col1}" Width="150"> 
          <DataGridTextColumn.ElementStyle> 
           <Style> 
            <Setter Property="TextBlock.TextWrapping" Value="Wrap" /> 
           </Style> 
          </DataGridTextColumn.ElementStyle> 
         </DataGridTextColumn> 
         <DataGridTextColumn Header="Value" Binding="{Binding col2}" Width="*"> 
          <DataGridTextColumn.ElementStyle> 
           <Style> 
            <Setter Property="TextBlock.TextWrapping" Value="Wrap" /> 

           </Style> 
          </DataGridTextColumn.ElementStyle> 
         </DataGridTextColumn> 
        </DataGrid.Columns> 
       </DataGrid> 

      </Grid> 

     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl > 

CODE после получения списка

lstFinal.Add(e.Result as List<Col1Col2>); 
TabItem newtab = new TabItem(); 
newtab.DataContext = lstFinal[lstFinal.Count - 1]; 


newtab.Header = txtMaterial.Text; 
tabMain.Items.Add(newtab); 
tabMain.SelectedIndex = tabMain.Items.Count - 1; 
DataGrid dg = newtab.FindName("dgResults") as DataGrid; 
dg.ItemsSource = lstFinal[lstFinal.Count - 1]; 
+0

да, это моя проблема. Dg имеет значение null (не найдено). list isfine, только dg является проблемой – gericooper

+0

Когда вы публикуете вопрос, тогда очень важно описать, что именно происходит неправильно - http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist , В вашей ситуации я бы попытался решить все на стороне ViewModel, http://msdn.microsoft.com/en-us/magazine/dd419663.aspx - это немного старая, но тем не менее прочная статья о MVVM, которая активно использует TabItems. –

+0

Я едва знаком с точной механикой 'FindName' и ее использованием с шаблоном, поэтому я мог бы рекомендовать вам попробовать классический способ поиска с помощью' LogicalTreeHelper' - http://stackoverflow.com/questions/636383/how-can -i-найти-МОФ-контроля по имени или типа. Также прочитайте http://stackoverflow.com/questions/16101411/find-children-of-a-user-control-in-a-tab-item. –

ответ

0

Ваша проблема вызвана тем, что вы пытаетесь ссылаться на элемент управления в пределах DataTemplate. Во время выполнения этот шаблон, возможно, был применен к большому количеству элементов управления, поэтому сначала вы должны получить объект, на который был нанесен шаблон, и , затем, вы можете получить доступ к элементу управления с DataTemplate.

Вы можете узнать, как это сделать, ссылаясь на страницу How to: Find DataTemplate-Generated Elements на MSDN. Однако, в общем, это то, как это делается (от связанной страницы):

// Getting the currently selected ListBoxItem 
// Note that the ListBox must have 
// IsSynchronizedWithCurrentItem set to True for this to work 
ListBoxItem myListBoxItem = 
    (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem)); 

// Getting the ContentPresenter of myListBoxItem 
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem); 

// Finding textBlock from the DataTemplate that is set on that ContentPresenter 
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate; 
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter); 

// Do something to the DataTemplate-generated TextBlock 
MessageBox.Show("The text of the TextBlock of the selected list item: " 
    + myTextBlock.Text); 

Определение метода FindVisualChild также можно найти на странице, связанной, наряду с описанием процесса.