2009-08-04 3 views
3

은 내가 누구의 ItemsSource 전망 (된 UserControls) 루트 A 원소 TabItem의으로 가지고있는 각각의 관찰 컬렉션에 바인딩 된 을 TabControl 있어요. 이 표시 될 때 래퍼가 충돌을 일으키는 의 UserControl 것처럼 그러나 헤더 텍스트는 각 TabItem의 내용이다 :XAML TabControl의 탭 콘텐츠 영역에 탭 머리글이 표시되는 이유는 무엇입니까?

alt text http://i31.tinypic.com/2z7pctz.png

을 TabControl은 SmartFormView.xaml에 있습니다

<UserControl x:Class="TestApp.Views.SmartFormView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel 
     Margin="10"> 
     <TextBlock Text="{Binding Title}" 
      FontSize="18"/> 
     <TextBlock Text="{Binding Description}" 
      FontSize="12"/> 

     <TabControl 
      Margin="0 10 0 0" 
      ItemsSource="{Binding SmartFormAreaViews}"/> 
    </StackPanel> 
</UserControl> 

TabControl 안에 TabItem이 표시되도록 변경해야하는 항목은 무엇입니까? 내가 만들고 ObservableCollection에으로 각 뷰를로드 여기

<UserControl x:Class="TestApp.Views.SmartFormAreaView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <TabItem Header="This is the header"> 
     <StackPanel Margin="10"> 
      <TextBlock Text="this is the content"/> 
     </StackPanel> 
    </TabItem> 
</UserControl> 

그리고는 다음과 같습니다 : 여기

SmartFormAreaView.xaml라는 TabItem의 전망이다

var areas = from area in xmlDoc.Descendants("area") 
      select area; 
foreach (var area in areas) 
{ 
    SmartFormArea smartFormArea = new SmartFormArea(); 
    smartFormArea.IdCode = area.Attribute("idCode").Value; 
    smartFormArea.Title = area.Attribute("title").Value; 
    SmartFormAreaPresenter smartFormAreaPresenter = new SmartFormAreaPresenter(smartFormArea); 
    SmartFormAreaViews.Add(smartFormAreaPresenter.View as SmartFormAreaView); 
} 

답변

4

:

으로 보여야하는 방법은 다음과 항목 컨테이너의 인스턴스에 래핑됩니다. 항목 컨테이너는 TabItem 또는 ListBoxItem과 같은 클래스입니다. 항목 컨테이너는 일반적으로 ContentControl 또는 HeaderedContentControl이며 실제 항목은 Content 속성에 할당되므로 템플릿 등을 사용하여 내용 표시 방법을 제어 할 수 있습니다. ItemControl의 ItemContainerStyle 속성을 사용하여 항목 컨테이너 자체의 스타일을 지정할 수도 있습니다.

이 경우, ItemsSource를 SmartFormAreaPresenters의 목록에 바인딩해야합니다. 그런 다음 탭 컨트롤이 같은 것을 사용 :

<TabControl ItemsSource="{Binding SmartFormAreaPresenters}"> 
    <TabControl.ItemContainerStyle> 
    <Style TargetType="{x:Type TabItem}"> 
     <Setter Property="Header" Value="{Binding HeaderText}" /> 
    </Style> 
    </TabControl.ItemContainerStyle> 

    <TabControl.ContentTemplate> 
    <DataTemplate DataType="{x:Type local:SmartFormAreaPresenter}"> 
     <local:SmartFormAreaView /> 
    </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

을 HeaderText에 당신의 SmartFormAreaPresenter에 적합한 속성입니다. SmartFormAreaView 정의에서 TabItem을 제거해야합니다. 각보기의 DataContext는 적절한 Presenter로 자동 설정됩니다.

다양한 ItemsControl 관련 항목에 대한 훌륭한 토론은 Dr. WPF의 blog을 참조하십시오.

0

TabControl 것 UserControl 또는 SmartFormAreaView가 아닌 ​​TabItem으로 캐스팅 될 수있는 경우에만 해당 컨트롤로 컨트롤을 수락합니다.

그래서 당신은 당신의 시각적 트리와 일반 TabItems를 입력하거나, 당신은 TabItems 서브 클래스, 또는 컨테이너와 같은 유형을 받아, 그 IsItemItsOwnContainerOverride 방법을 재정의 할 TabControl를 서브 클래스. 다음 각 항목이며, 항목 (직접 또는 ItemsSource 통해) 그 컨트롤 항목 컨테이너 인스턴스 아닌 그 아이템 컬렉션에 추가 된 경우, 임의의 ItemsControl 들어

protected override bool IsItemItsOwnContainerOverride(object item) 
{ 
    return item is YourControlTypeHere || item is TabItem; 
} 
관련 문제