WPF菜单项的标题和标题模板

9

我想将一个键值对列表绑定到菜单项列表。我认为应该使用MenuItem.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.HeaderTemplate替换为MenuItem.Header,它有效了。

            <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 在这里不起作用吗?
4个回答

15

Micah是正确的。在第一种方法中,我告诉菜单项如何模板化自己,但从未告诉它绑定的数据!以下代码可以正常工作:

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

9
由于HeaderTemplate无法访问绑定到菜单项的数据。

谢谢。我如何在XAML中访问HeaderTemplate中的数据?MenuItem.Template不是从其父级Menu继承DataContext吗? - treehouse
1
显然,当我对WPF不是太了解时,我发布了这个问题。感谢Micah并为晚些时候接受道歉。 - treehouse

1

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

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

正在告诉“我想要获取 MenuItem 内容 并插入数据,这些数据必须被可视化”。然后将其插入到点的位置:

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

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

抱歉,我在发布问题时错过了DataTemplate。没有DataTemplate,代码无法编译。我刚刚更新了我的问题。使用DataTemplate时,菜单项标题不会显示。 - treehouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接