2009-05-22 54 views
9

KeyValuePairのリストをMenuItemのリストにバインドしたいとします。 私はMenuIten.HeaderTemplateを使うべきだと思ったが、うまくいかなかった。私は空白のヘッダーしか持っていません。WPF MenuItemヘッダーとヘッダーテンプレート

  <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は動作しません。

答えて

8

HeaderTemplateはメニュー項目にバインドされているデータにアクセスできないため、

+0

ありがとうございます。 XAMLでHeaderTemplateのデータにアクセスするにはどうすればよいですか? MenuItem.Templateはその親であるMenuからDataContextを継承しませんか? –

+1

明らかに私はWPFについてあまり知らなかったときにこの質問を投稿します。 Micahに感謝し、遅く受け入れて申し訳ありません。 –

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

申し訳ありませんが、質問を投稿するときにDataTemplateが見つかりませんでした。 DataTemplateがなければ、コードはコンパイルされません。私はちょうど私の質問を更新した。メニュー項目のヘッダーはDataTemplateで表示されません。 –

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にコンテンツを取ると、ウィッヒが可視化されなければならないデータを挿入したい」語っている。この

<MenuItem 
      Header="Template" 
      ItemsSource="{Binding Path=Samples}"> 
      <MenuItem.ItemTemplate> 
       <DataTemplate> 
         .... 
    </DataTemplate> 
    </MenuItem.ItemTemplate> 
</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> 
関連する問題