2013-06-12 60 views
2

我在我的XAML中顯示了一個TabControl以及用於顯示標題,內容和關閉按鈕以關閉該選項卡的模板中的以下代碼。但我希望內容根據標籤的類型而有所不同。即視圖模型的類型。現在它被硬編碼到一個特定的視圖。我以前使用數據模板中的數據類型屬性。但我不知道如何將它與模板選擇器結合使用。wpf如何根據類型設置數據模板

<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類如下:

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集合:

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數據模板:

<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''(或者將'x:Key'放在那裏並設計選擇器來專門查看合適的鑰匙)。 – nmclean

+0

刪除itemtemplate屬性工作!!。仍然不清楚這是如何。但是謝謝.... – Satfactor