2013-06-12 3 views
2

XAML에 다음 코드를 사용하여 TabControl을 표시하고 템플릿을 사용하여 머리글, 내용 및 닫기 단추를 표시하여 탭을 닫습니다. 그러나 탭의 유형에 따라 내용이 달라지기를 바랍니다. 즉 뷰 모델의 유형. 지금은 특정보기로 하드 코딩되어 있습니다. 이전에 데이터 템플릿에서 데이터 형식 속성을 사용했습니다. 하지만 템플릿 선택기와 함께 사용하는 방법을 잘 모르겠습니다.wpf 형식에 따라 데이터 형식을 설정하는 방법

public ObservableCollection<ViewModelBase> Tabs 
{ 
    get 
    { 
     if (tabs == null) 
     { 
      tabs = new ObservableCollection<ViewModelBase>(); 
      var itemsView = (IEditableCollectionView)CollectionViewSource.GetDefaultView(tabs); 
      itemsView.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtEnd; 
     } 

     return tabs; 
    } 
} 

그래서 내 ItemContentTemplate 데이터 템플릿과 같은 것을 원하는 :

public class TemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate ItemTemplate { get; set; } 
    public DataTemplate NewButtonTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item == CollectionView.NewItemPlaceholder) 
     { 
      return NewButtonTemplate; 
     } 
     else 
     { 
      return ItemTemplate; 
     } 
    } 
} 

내 탭이 ViewModels의 모음입니다 :

<Window.Resources> 
    <DataTemplate x:Key="ClosableTabItemTemplate"> 
     <DockPanel Width="120"> 
      <Button 
       Command="{Binding ElementName=MainTabControl, Path=DataContext.RemoveTabCommand}" 
       CommandParameter="{Binding Path=DealName}" 
       Content="x" 
       Cursor="Hand" 
       DockPanel.Dock="Right" 
       Focusable="False" 
       FontFamily="Courier" 
       FontSize="9" 
       FontWeight="Bold"      
       Padding="0" 
       VerticalContentAlignment="Bottom" 
       Width="16" Height="16" 
      /> 

      <ContentControl 
       Content="{Binding Path=Header}"      
       VerticalAlignment="Center"> 

       <ContentControl.Style> 
        <Style> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=Header}" Value="New Deal"> 
           <Setter Property="ContentControl.Foreground" Value="Blue"></Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </ContentControl.Style> 
      </ContentControl>     
     </DockPanel> 
    </DataTemplate> 

    <DataTemplate x:Key="newTabButtonContentTemplate"> 
     <Grid/> 
    </DataTemplate> 

    <DataTemplate x:Key="newTabButtonHeaderTemplate"> 
     <Button Content="+" Width="20" Height="20" Command="{Binding ElementName=MainTabControl, Path=DataContext.NewTabCommand}"/> 
    </DataTemplate> 

    <DataTemplate x:Key="itemContentTemplate"> 
     <v:DealView/> 
    </DataTemplate> 

    <v:TemplateSelector x:Key="headerTemplateSelector" 
         NewButtonTemplate="{StaticResource newTabButtonHeaderTemplate}" 
         ItemTemplate="{StaticResource ClosableTabItemTemplate}"/> 

    <v:TemplateSelector x:Key="contentTemplateSelector" 
         NewButtonTemplate="{StaticResource newTabButtonContentTemplate}" 
         ItemTemplate="{StaticResource itemContentTemplate}"/> 
</Window.Resources> 

<Window.DataContext> 
    <vm:MainViewModel /> 
</Window.DataContext> 

<Grid> 
    <DockPanel> 
     <TabControl DockPanel.Dock="Bottom" x:Name="MainTabControl" Margin="2" ItemsSource="{Binding Tabs}" 
           IsSynchronizedWithCurrentItem="True"         
           ItemTemplateSelector="{StaticResource headerTemplateSelector}" 
           ContentTemplateSelector="{StaticResource contentTemplateSelector}"> 

      <TabControl.Resources> 
       <Style TargetType="{x:Type TabPanel}"> 
        <Setter Property="Background" Value="AliceBlue"/> 
       </Style>     
      </TabControl.Resources> 
     </TabControl> 
    </DockPanel> 
</Grid> 

TemplateSelector 클래스는 다음과 같다

<DataTemplate x:Key="itemContentTemplate"> 
    when type is DealViewModel use <v:DealView/> 
    when type is DealSummaryViewModel use <v:DealSummaryView/> 
    etc 
</DataTemplate> 

답변

0

이전에 데이터 템플릿에서 데이터 유형 속성을 사용했습니다. 하지만 나는 템플릿 셀렉터와 함께 사용하는 방법을 잘 모르겠습니다.

그냥 같이 다시 기본에 떨어질 경우

return base.SelectTemplate(item, container); 

... 당신이이 DataType을 일치하는 템플릿을 선택하면 기본 동작을, 즉 얻어야한다. 충분하니? (그게 않는 모든이기 때문에 사실, 당신은 단지 null을 반환 할 수 있습니다.)

또 다른 옵션은 선택에서 자원 키에 액세스하는 것입니다

return ((FrameworkElement)container).FindResource(resourceKey) as DataTemplate; 
resourceKey이 항목을 기준으로 계산

및 템플릿 이 키는 컨테이너보다 트리 위쪽으로 정의됩니다.

+0

그런 다음 구문이 어떻게 변경됩니까? 지금은 ItemTemplate = "{StaticResource itemContentTemplate}"/>이고 이에 해당하는 데이터 템플릿은 입니다. 어떻게 바뀌겠습니까? – Satfactor

+0

선택기에서'ItemTemplate' 속성을 제거하고'DataType = "{x : Type vm : DealViewModel}"'으로 대체하십시오 (또는'x : Key'를 그대로두고 특별히 보이도록 선택자를 디자인하십시오 적절한 키를 누르십시오). – nmclean

+0

itemtemplate 속성을 제거하는 것이 효과가있었습니다 !!! 그 방법에 대해 아직도 명확하지 않습니다. 하지만 고마워 .... – Satfactor

관련 문제