2009-05-22 25 views
9

Desidero associare un elenco di KeyValuePair a un elenco di MenuItems. Ho pensato che dovrei usare MenuIten.HeaderTemplate, ma non ha funzionato. Ho solo intestazioni vuote.WPF MenuItem Header and 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> 

Quindi ho sostituito MenuItem.HeaderTemplate con MenuItem.Header, ha funzionato.

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

Qualcuno può spiegarmi perché HeaderTemplate non funziona qui?

risposta

8

Poiché l'HeaderTemplate non ha accesso ai dati associati alla voce di menu.

+0

Grazie. Come posso accedere ai dati in HeaderTemplate in XAML, quindi? MenuItem.Template non eredita DataContext dal suo genitore, il Menu? –

+1

Apparentemente ho postato questa domanda quando non sapevo molto su WPF. Grazie Micah e mi dispiace per la tarda accettazione. –

0

La definizione HeaderTemplate dovrebbe essere un DataTemplate, non contento diretta 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> 
... 
+0

Spiacente, ho perso il DataTemplate quando ho postato la domanda. Senza DataTemplate il codice non viene compilato. Ho appena aggiornato la mia domanda. Le intestazioni delle voci di menu non vengono visualizzate con DataTemplate. –

14

Micah è corretta. Nel primo approccio ho detto alla voce di menu come creare template, ma non gli ho mai detto a quali dati si lega! Le seguenti opere:

  <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

Lo scopo Template è quello di aggiungere alcuni elementi al VisualTree. DataTemplate viene utilizzato per gli elementi secondari ([Sub] MenuItem, ListBoxItem in ListBox e così via) e viene applicato al titolare dell'articolo, è contrario al ControlTemplate, che viene applicato al controllo stesso. Quello che effettivamente fatto da questo

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

sta dicendo: "Voglio prendere MenuItem contenuti e inserire i dati, wich deve essere visualizzato". E quindi inserire questo insted punti:

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

Così si sta inserendo la voce di menu aggiuntivo alla voce di menu attualmente iterazione. Non riesco a vedere il punto. Il prossimo è più chiaro:

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