2013-03-25 5 views

답변

3

당신은 당신이 다른 방법으로 할 원하는 일을 생각 했습니까? 일반적으로 DataTemplate을 사용하면 해당 템플릿 안의 컨트롤에 설정할 수있는 모든 속성은 정적 (데이터에 액세스해야하는 이유) 또는 제공된 데이터에 의존해야하며 DataBinding에 의해 구현되어야합니다.

다음 코드를 사용하여 ListBox를 가져올 수 있습니다. 나는 여전히이 코드를 사용하는 대신 구조를 재고하는 것이 더 나을 것이라고 생각한다.

XAML : 뒤에

<Window x:Class="WpfApplication1.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MainWindow" Height="350" Width="525"> 

    <TabControl x:Name="MessageBoxTabControl"> 
     <TabControl.ContentTemplate> 
      <DataTemplate > 
       <ListBox x:Name="MessageListBox" > 
        <ListBoxItem Content="ListBoxItem 1" /> <!-- just for illustration --> 
       </ListBox> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
     <TabItem Header="Tab 1" /> 
     <TabItem Header="Tab 2" /> 
    </TabControl> 
</Window> 

코드 :

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    ListBox lbx = FindVisualChildByName<ListBox>(this.MessageBoxTabControl, "MessageListBox"); 
    if (lbx != null) 
    { 
     // ... what exactly did you want to do ;)? 
    } 
} 

private T FindVisualChildByName<T>(DependencyObject parent, string name) where T : FrameworkElement 
{ 
    T child = default(T); 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
    { 
     var ch = VisualTreeHelper.GetChild(parent, i); 
     child = ch as T; 
     if (child != null && child.Name == name) 
      break; 
     else 
      child = FindVisualChildByName<T>(ch, name); 

     if (child != null) break; 
    } 
    return child; 
} 

이 실제로 템플릿을 사용하는 두 번째, 비슷한 방법으로는, 또한, 여전히 ContentPresenter에에 도착하는 시각적 트리에 따라 달라집니다 (위와 유사한 FindVisualChild 구현) :

ContentPresenter cp = FindVisualChild<ContentPresenter>(this.MessageBoxTabControl); 
ListBox lbx = cp.ContentTemplate.FindName("MessageListBox", cp) as ListBox; 

시각적 트리에 대한 종속성이있는 경우이 메서드로 항상 선택한 탭의 ListBox 만 찾을 수 있습니다.

0

이 같아야합니다

TabItem relevantTabItem = howeverYouGetThisThing(); 
var grid = System.Windows.Media.VisualTreeHelper.GetChild(relevantTabItem, 0); 
var listBox = (ListBox) System.Windows.Media.VisualTreeHelper.GetChild(grid, 0); 
+0

을 실제로 – 0x4f3759df

+0

죄송합니다, 몰랐어, 다음도 아마 당신을 한 단계 더 깊은 – Akku

+0

이동 더 깊이 드릴 다운해야합니다. 결국, 나는 정확히 TabControl.ContentTemplate이 어떻게 만들어 졌는지 모르지만, 당신이 기본적으로 VisualTreeHelper를 탐색해야하는 너무 복잡한 것은 아니어야한다고 생각합니다. 사실 나는 또한 여기에 잘못된 질문을하고있는 중이며 오히려 실제로이 작업을 수행하고자하는 것이 무엇인지 질문해야한다고 생각합니다. ListBox의 속성을 viewModel 속성에 바인딩하여 해결할 가능성이 높습니다. 그런 다음 모델에서 쉽게 변경할 수 있습니다. – Akku

관련 문제