2009-05-22 132 views
9

我想將KeyValuePair列表綁定到MenuItems列表。 我以爲我應該使用MenuIten.HeaderTemplate,但它沒有奏效。我只有空白標題。WPF MenuItem Header和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.Header替換MenuItem.HeaderTemplate,它工作。

  <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在這裏不起作用嗎?

回答

8

因爲HeaderTemplate無法訪問綁定到菜單項的數據。

+0

謝謝。那麼如何訪問XAML中HeaderTemplate中的數據? MenuItem.Template是否從它的父級繼承DataContext?Menu? – 2009-05-22 18:33:33

+1

顯然我發佈這個問題時,我不太瞭解WPF。謝謝彌迦,對於遲到的接受感到抱歉。 – 2010-01-29 15:11:26

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

彌是正確的。在第一種方法中,我告訴菜單項如何模板本身,但從來沒有告訴它綁定了什麼數據!以下作品:

  <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

目的模板是添加一些元素到的VisualTree。 DataTemplate用於子項目([Sub] MenuItem,ListBox中的ListBoxItem等等)並應用於項目持有者,這與ControlTemplate相反,適用於控件本身。 你實際做這個

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

告訴「我要採取菜單項內容和插入,必須至極可視化數據」是什麼。然後插入這個insted小點:

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