WPF MenuItem Cabeçalho e HeaderTemplate
-
23-08-2019 - |
Pergunta
Eu quero vincular uma lista de KeyValuePair a uma lista de MenuItems. Eu pensei que eu deveria usar MenuIten.HeaderTemplate, mas não funcionou. Eu só tenho cabeçalhos em branco.
<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>
Então eu substituído MenuItem.HeaderTemplate com MenuItem.Header, funcionou.
<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>
Alguém pode me explicar por que HeaderTemplate não funciona aqui?
Solução
Porque o HeaderTemplate não tem acesso a essa informação ser ligado ao item do menu.
Outras dicas
Micah está correto. Na primeira abordagem eu disse o item de menu como ao modelo em si, mas nunca disse que os dados que se liga a! As seguintes 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>
O objetivo do o modelo é adicionar alguns elementos para o VisualTree. DataTemplate é usado para as sub-itens ([SUB] MenuItem, ListBoxItem na listagem, e assim por diante) e é aplicado ao suporte de artigos, que é contrário ao ControlTemplate, wich é aplicada ao próprio controlo. O que você realmente fez por este
<MenuItem
Header="Template"
ItemsSource="{Binding Path=Samples}">
<MenuItem.ItemTemplate>
<DataTemplate>
....
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
está dizendo "Eu quero tomar MenuItem conteúdo e inserir os dados, wich devem ser visualizadas". E, em seguida, inserir este pontos Insted:
<MenuItem Header="{Binding}">... </MenuItem>
Então, você está inserindo item de menu adicional para o item de menu actualmente iteração. Eu não posso ver o ponto. Em seguida é mais clara:
<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>
A definição HeaderTemplate deve ser um DataTemplate, não direta conteúdo 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>
...