2009-10-18 28 views
4

我試圖創建TreeView它有兩個級別,但我無處可去。我有一個ItemTemplateSelector(它的工作原理 - 選擇下面列出的前兩個模板中的任何一個),但我無法讓孩子使用DataTemplate填充。這是我的代碼:TreeView的第二級ControlTemplate

public class PlannedMealGroup : INotifyPropertyChanged { 
     public ObservableCollection<PlannedMeal> Meals; 
     public Constants.MealTimes MealTime; 
    ...// these implement INotifyPropertyChanged 
} 

<HierarchicalDataTemplate x:Key="groupTemplate" ItemsSource="{Binding Meals}"> 
    <TextBlock Text="{Binding Path=MealTime}"/> 
    <HierarchicalDataTemplate.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="tre_PreviewMouseRightButtonDown"/> 
     </Style> 
    </HierarchicalDataTemplate.ItemContainerStyle> 
</HierarchicalDataTemplate> 
<DataTemplate x:Key="mealTemplate"> 
    <Border Name="Border" Margin="4,2" Padding="3" Background="Transparent" IsHitTestVisible="True" SnapsToDevicePixels="true" BorderThickness="0.6" CornerRadius="3"> 
     <Border Name="InnerBorder" Background="Transparent" IsHitTestVisible="True"> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding Recipe.Icon,Converter={StaticResource IconConverter}, ConverterParameter=16}" Stretch="None" /> 
       <TextBlock Text="{Binding Converter={StaticResource RecipeServingConverter}}"/> 
      </StackPanel> 
     </Border> 
    </Border> 

<TreeView ItemTemplateSelector="{StaticResource PlannedMealTemplateSelector}" Style="{StaticResource GroupedTreeView}"> 
    <TreeView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel IsItemsHost="True" Orientation="{Binding Orientation,RelativeSource={x:Static RelativeSource.TemplatedParent}}" /> 
     </ItemsPanelTemplate> 
    </TreeView.ItemsPanel> 
    <TreeView.ContextMenu> 
    ... 

<Style x:Key="GroupedTreeViewItem" TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="IsExpanded" Value="True"/> 
    <Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type TreeViewItem}"> 
    <Border Name="Border" Margin="4,2" Padding="3" Background="{StaticResource GroupBackgroundBrush}" IsHitTestVisible="True" SnapsToDevicePixels="true" BorderThickness="0.6" CornerRadius="3"> 
      <Expander Name="Exp" IsExpanded="{Binding IsExpanded, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},Mode=TwoWay}"> 
       <Expander.Header> 
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
         x:Name="PART_Header" ContentSource="Header"/> 
       </Expander.Header> 
       <ItemsPresenter x:Name="ItemsHost"/> 
      </Expander> 
     </Border> 
    </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="GroupedTreeView" TargetType="TreeView"> 
    <Setter Property="ItemContainerStyle" Value="{StaticResource GroupedTreeViewItem}"/> 
</Style> 

感謝您的任何指針。

回答

3

這個問題讓我想起了幾個小時,所以我會把這個發佈給其他人。我需要爲第一個模板資源中的第二級項目設置樣式。

<HierarchicalDataTemplate x:Key="groupTemplate" ItemsSource="{Binding Meals}"> 
      <TextBlock Text="{Binding Path=MealTime}"/> 
      <HierarchicalDataTemplate.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="tre_PreviewMouseRightButtonDown"/> 
        <Setter Property="Background" Value="Red"/> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type TreeViewItem}"> 
           <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
            x:Name="PART_Header" ContentSource="Header"/> 
...