WPF MenuItem Header и HeaderTemplate - PullRequest
9 голосов
/ 22 мая 2009

Я хочу связать список KeyValuePair со списком MenuItems. Я думал, что я должен использовать MenuIten.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 голосов
/ 29 января 2010

Михей прав. При первом подходе я говорил пункту меню, как самому шаблонировать, но никогда не говорил, с какими данными он связывается! Следующие работы:

            <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 голосов
/ 22 мая 2009

Поскольку HeaderTemplate не имеет доступа к данным, привязанным к пункту меню.

1 голос
/ 11 октября 2011

Цель шаблона - добавить некоторые элементы в VisualTree. DataTemplate используется для подэлементов ([Sub] MenuItem, ListBoxItem в ListBox и т. Д.) И применяется к держателю элементов, это противоречит ControlTemplate, которое применяется к самому элементу управления. Что вы на самом деле сделали этим

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

говорит: «Я хочу взять MenuItem content и вставить данные, которые должны быть визуализированы». А затем вставьте следующие точки:

 <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 голосов
/ 26 мая 2009

Определение HeaderTemplate должно быть DataTemplate, а не прямым содержимым пользовательского интерфейса:

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