Найти элемент в DataTemplate, примененный к TabItem

У меня возникла проблема при попытке найти элемент, объявленный в DataTemplate, который после был применен как ContentTemplate к объекту TabItem. Я видел, что уже есть некоторые решения в отношении этой проблемы, но на самом деле никто из них не работает в моем случае, и я хотел бы понять, почему (очевидно, я ошибаюсь в некоторых местах) Вот пример кода:

             
    
        
             
            
            
            
                        

                                
            
                
                
                
                
                
            
        

        

        


        
        
        
    

Этот код программно применяется к данному объекту TabItem следующим образом:

this.ContentTemplate = FindResource("TabItemDataTemplate") as DataTemplate;

После того, как мне нужен доступ к элементу ListView, объявленному в DataTemplate, я выполняю коды, найденные в Интернете, а также на этом сайте. Вот краткий пример:

/* Getting the ContentPresenter of myListBoxItem*/          
ContentPresenter myContentPresenter =
    FindVisualChild(this);

// this.GetVisualChild(0)
/* Finding textBlock from the DataTemplate that is set on that ContentPresenter*/
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;

ListView repoListView = (ListView)myDataTemplate.FindName("repoView", 
    myContentPresenter);

Проблема 1: в этом случаеContentTemplate ContentPresenter имеет значение Null, поэтому выполнение кода прекращается. Prolem2: Хорошо, я думаю, может быть, мне нужно перейти непосредственно к содержимому броска TabItem, чтобы код стал более или менее:

/* Getting the ContentPresenter of myListBoxItem*/          
ContentPresenter myContentPresenter =
    FindVisualChild(this);

// this.GetVisualChild(0)
/* Finding textBlock from the DataTemplate that is set on that ContentPresenter*/
DataTemplate myDataTemplate = this.ContentTemplate;

ListView repoListView = (ListView)myDataTemplate.FindName("repoView", 
    myContentPresenter);

этот является объектом TabItem. Но странные вещи, что ContentTemplateэтот полностью отличается от назначенного выше. Я'Я уверен, что я где-то пропустил, вы можете помочь мне разобраться в проблеме? Спасибо.

Ответы на вопрос(3)

Ты неЯ не хочу использовать какие-либо свойства шаблонаTabItem, поскольку они используются для создания фактических элементов управления, а не для их хранения. Вы должны быть в состоянии искать визуальное дерево дляListView напрямую, а не проходя через.DataTemplate

 Tigran15 авг. 2009 г., 10:44
Конечно. Я "разрешить"Возможно, эта проблема вызвана вызовом ControlTemplate LoadContent (), который в моем конкретном случае возвращает Grid, который является корнем моего DataTemplate. Моя путаница заключалась в том, почему ContentPresenter не 'не содержат ничего? В примерах кода, найденных в Интернете, в DataTemplate не было явного объявления ContentPresenter. В конце я немного изменяю структуру своего кода, для того, чтобы получить данные, которые мне нужны, другими способами, я могу быть также более простым :), кстати, до сих пор я не делалне могу найти решение такой проблемы.
 Tigran15 авг. 2009 г., 10:44
Одна вещь, которую я заметил при навигации, - это использование примеров кода, в котором они обычно применяют элемент DataTemplate из Parent к Item. Поэтому я попытался применить TabControl 'свойство ItemTemplate (даже если оно 'Это не очень удобный способ для этого приложения, но только для того, чтобы попытаться понять проблему), но это неи работать тоже.
Решение Вопроса

Хорошо, вот мы и пришли :) Я решаю проблему не очень хорошим способом, но кажется, что работает правильно. Как я упоминал выше, я использовал метод LoadContent, и он возвращает мне объект ListView, но, кстати, он не былt ListView, который фактически использует пользовательский интерфейс. Поэтому, чтобы решить эту проблему, я добавляю статическое свойство для хранения моего объекта REAL ListView (статического, поскольку у меня есть один DataTemplate, который содержит ListView, совместно используемый несколькими TabItems, поэтому ListView также совместно используется) и добавляю обработчик событий в мой DataTemplate -> нагруженный, Поймать это событие, которое в моем случае вызывает только те, в жизни приложения, вRoutedEvent-х OriginalSource Я получил объект REAL ListView, который механизм WPF использует для визуализации в пользовательском интерфейсе. Надеюсь, что мое решение кому-нибудь поможет. Спасибо вам всем.

Просто, если у вас естьDataGridиTemplateColumn который содержит шаблон данных, вы можете использовать следующий пример кода:


    
        
            
                
                
            
        
    

TextBlock tBlock = (TextBlok)photoPathColumn.CellEditingTemplate.FindName(
                       "photo",
                       photoPathColumn.GetCellContent(CustomersDataGrid.CurrentItem));
кудаphoto это имя текстового блокакудаphotoPathColumn это.DataGridTemplateColumn
 Shimmy24 нояб. 2010 г., 16:07
Это исключение.

Ваш ответ на вопрос