3

派生オブジェクトのリストにバインドすることで、XAML またはコードで手動でメニューを作成する必要がないようにしたいと考えていICommandます。MenuItemただし、結果のメニューに 2 つのレベルのメニュー項目がある (つまり、それぞれが に含まれているMenuItem)という問題が少し発生しています。

代替テキスト

私の推測では、これは WPF がバインディング用に自動的に を生成しているために発生していると思われますが、MenuItem実際に使用している「ビューアー」は既にですMenuItem(から派生していMenuItemます):

<ContextMenu
    x:Name="selectionContextMenu"
    ItemsSource="{Binding Source={x:Static OrangeNote:Note.MultiCommands}}"
    ItemContainerStyleSelector="{StaticResource separatorStyleSelector}">
    <ContextMenu.ItemTemplate>
        <DataTemplate>
            <Viewers:NoteCommandMenuItemViewer
                CommandParameter="{Binding Source={x:Static OrangeNote:App.Screen}, Path=SelectedNotes}" />
        </DataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

(ItemContainerStyleSelector はhttp://bea.stollnitz.com/blog/?p=23Separatorからのもので、バインドされたソース内に要素を含めることができます。)

したがって、メニューは のコレクションにバインドされ、ICommand各アイテムCommandParameterは同じグローバル ターゲットに設定されます (たまたまコレクションですが、それは重要ではありません)。

私の質問は、WPF が各項目を自動的にラップしないようにバインドできる方法はありますMenuItemか?

4

2 に答える 2

3

残念ながら、この問題を回避する最善の方法は、ItemTemplate ではなく、MenuItem のスタイルを使用することです。次に、スタイルの各プロパティをオブジェクトのプロパティにバインドできます。たとえば、次のようなものです。

<Style x:Key="SelectionContextMenuStyle" TargetType="MenuItem">
    <Setter Property="Header" Value="{Binding Path=Text}" />
    <Setter Property="Command" Value="{Binding Path=Command}" />
    <Setter Property="CommandParameter" Value="{Binding Path=Parameter}" />
</Style>

ItemTemplate が機能するはずのように思えますが、これがより良い方法ですが、これが実際に適切に機能することがわかった唯一の方法です。

于 2010-06-11T16:59:15.420 に答える
2

ContextMenu をサブクラス化し、GetContainerForItemOverride をオーバーライドする傾向があります。

public class ContextMenuWithNoteCommands : ContextMenu
{
  protected virtual DependencyObject GetContainerForItemOverride()
  {
    return new NoteCommandMenuItemViewer();
  }
}

次に、CommandParameter バインディングを NoteCommandMenuItemViewer スタイルまたは ContextMenu.ItemContainerStyle のいずれか適切な方に設定します。

これは、通常の MenuItem で ItemContainerStyle を単純に使用して、必要な効果を得ることができないことを前提としています。

<ContextMenu ...>
  <ContextMenu.ItemContainerStyle>
    <Style>
      ...
    </Style>
  </ContextMenu.ItemContainerStyle>
</ContextMenu>
于 2010-06-11T18:06:41.423 に答える