2009-05-22 14 views
9

Quiero vincular una lista de KeyValuePair a una lista de MenuItems. Pensé que debería usar MenuIten.HeaderTemplate, pero no funcionó. Solo tengo encabezados en blanco.WPF MenuItem Encabezado y 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> 

Luego reemplacé MenuItem.HeaderTemplate con MenuItem.Header, funcionó.

  <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> 

¿Alguien me puede explicar por qué HeaderTemplate no funciona aquí?

Respuesta

8

Porque HeaderTemplate no tiene acceso a los datos que están vinculados a la opción de menú.

+0

Gracias. ¿Cómo accedo a los datos en HeaderTemplate en XAML? ¿MenuItem.Template no hereda el DataContext de su principal, el Menú? –

+1

Aparentemente publico esta pregunta cuando no sabía demasiado sobre WPF. Gracias Micah y lo siento por la aceptación tardía. –

0

La definición HeaderTemplate debe ser un DataTemplate, no contento interfaz de usuario directa:

... 
<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> 
... 
+0

Lo siento, me perdí el DataTemplate al publicar la pregunta. Sin DataTemplate, el código no se compila. Acabo de actualizar mi pregunta. Los encabezados de elemento de menú no aparecen con DataTemplate. –

14

Miqueas es correcta. En el primer acercamiento, le dije al menú cómo hacer la plantilla, pero nunca le dije a qué datos se une. Las siguientes obras:

  <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

El propósito de la plantilla es añadir algunos elementos a la VisualTree. DataTemplate se utiliza para los subelementos ([Sub] MenuItem, ListBoxItem en ListBox, etc.) y se aplica al titular de los elementos, es contrario a ControlTemplate, que se aplica al control en sí. lo que realmente hizo por esta

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

está diciendo "Quiero tomar Menultem contenido e insertar los datos, cosa que debe ser visualizado". Y luego insertar esta insted puntos:

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

Así que usted está insertando elemento de menú adicional para el elemento de menú actualmente la iteración. No puedo ver el punto. Siguiente es más claro:

<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> 
Cuestiones relacionadas