2009-05-22 129 views
9

我想将KeyValuePair列表绑定到MenuItems列表。 我以为我应该使用MenuIten.HeaderTemplate,但它没有奏效。我只有空白标题。WPF MenuItem Header和HeaderTemplate

  <MenuItem 
       Header="Template" 
       ItemsSource="{Binding Path=Samples}"> 
       <MenuItem.ItemTemplate> 
        <DataTemplate> 
         <MenuItem> 
          <MenuItem.HeaderTemplate> 
           <DataTemplate> 
            <StackPanel Orientation="Horizontal"> 
             <TextBlock Text="{Binding Path=Key}" FontWeight="Bold"/> 
             <TextBlock Text="{Binding Path=Value}" FontStyle="Italic" Margin="5,0,0,0"/> 
            </StackPanel> 
           </DataTemplate> 
          </MenuItem.HeaderTemplate>       </MenuItem> 
        </DataTemplate> 
       </MenuItem.ItemTemplate> 
      </MenuItem> 

然后我用MenuItem.Header替换MenuItem.HeaderTemplate,它工作。

  <MenuItem 
       Header="Template" 
       ItemsSource="{Binding Path=Samples}"> 
       <MenuItem.ItemTemplate> 
        <DataTemplate> 
         <MenuItem> 
          <MenuItem.Header> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="{Binding Path=Key}" FontWeight="Bold"/> 
            <TextBlock Text="{Binding Path=Value}" FontStyle="Italic" Margin="2,0,0,0"/> 
           </StackPanel> 
          </MenuItem.Header> 
         </MenuItem> 
        </DataTemplate> 
       </MenuItem.ItemTemplate> 
      </MenuItem> 

任何人都可以向我解释为什么HeaderTemplate在这里不起作用吗?

回答

8

因为HeaderTemplate无法访问绑定到菜单项的数据。

+0

谢谢。那么如何访问XAML中HeaderTemplate中的数据? MenuItem.Template是否从它的父级继承DataContext?Menu? – 2009-05-22 18:33:33

+1

显然我发布这个问题时,我不太了解WPF。谢谢弥迦,对于迟到的接受感到抱歉。 – 2010-01-29 15:11:26

0

的HeaderTemplate中的定义应该是一个DataTemplate,而不是直接UI内容:

... 
<MenuItem.HeaderTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Key}" FontWeight="Bold"/> 
      <TextBlock Text="{Binding Path=Value}" FontStyle="Italic" Margin="2,0,0,0"/> 
     </StackPanel> 
    </DataTemplate> 
</MenuItem.HeaderTemplate> 
... 
14

弥是正确的。在第一种方法中,我告诉菜单项如何模板本身,但从来没有告诉它绑定了什么数据!以下作品:

  <MenuItem 
      Header="Template" 
      ItemsSource="{Binding Path=Samples}"> 
      <MenuItem.ItemTemplate> 
       <DataTemplate> 
        <MenuItem Header="{Binding}"> 
         <MenuItem.HeaderTemplate> 
          <DataTemplate> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="{Binding Path=Key}" FontWeight="Bold"/> 
            <TextBlock Text="{Binding Path=Value}" FontStyle="Italic" Margin="5,0,0,0"/> 
           </StackPanel> 
          </DataTemplate> 
         </MenuItem.HeaderTemplate> 
        </MenuItem> 
       </DataTemplate> 
      </MenuItem.ItemTemplate> 
     </MenuItem> 
1

目的模板是添加一些元素到的VisualTree。 DataTemplate用于子项目([Sub] MenuItem,ListBox中的ListBoxItem等等)并应用于项目持有者,这与ControlTemplate相反,适用于控件本身。 你实际做这个

<MenuItem 
      Header="Template" 
      ItemsSource="{Binding Path=Samples}"> 
      <MenuItem.ItemTemplate> 
       <DataTemplate> 
         .... 
    </DataTemplate> 
    </MenuItem.ItemTemplate> 
</MenuItem> 

告诉“我要采取菜单项内容和插入,必须至极可视化数据”是什么。然后插入这个insted小点:

<MenuItem Header="{Binding}">... </MenuItem> 

所以你插入额外的菜单项到当前迭代菜单项。我看不到这一点。 下一个更加清楚:

<MenuItem Header="Template" ItemsSource="{Binding Samples}"> 
     <MenuItem.Resources> 
      <Style TargetType="{x:Type MenuItem}"> 
       <Setter Property="Command" Value="{Binding SomeCommand}" /> 
      </Style>    
     </MenuItem.Resources> 
     <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
      </DataTemplate>    
     </MenuItem.ItemTemplate> 
    </MenuItem>