Wenn ich Menüpunkte mit einer ObservableCollection binden, nur die "inneren" Bereich des MenuItem ist anklickbar:Wie kann ich eine ObservableCollection von ViewModels an ein MenuItem binden?
alt text http://tanguay.info/web/external/mvvmMenuItems.png
In meinem Ansicht ich dieses Menü haben:
<Menu>
<MenuItem
Header="Options" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>
Dann Ich binde es mit diesem DataTemplate:
<DataTemplate x:Key="MainMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
Background="Red"
CommandParameter="{Binding IdCode}"/>
</DataTemplate>
Da jedes Ansichtsmodell in dem ObservableCollection ManageMenuPageItemViewModels hat eine Eigenschaft Titel und IDCODE, der obige Code funktioniert auf dem ersten Blick in Ordnung.
JEDOCH, ist das Problem, dass die MenuItem in der Datatemplate tatsächlich innen andere MenuItem ist (, als ob es zweimal gebunden wird), so dass in der obigen Datatemplate mit BACKGROUND =“ Rot " gibt es eine Rote Box in jedem Menüpunkt und nur dieser Bereich kann angeklickt werden, nicht der gesamte Menübereich selbst (zB wenn der Benutzer auf den Bereich klickt, wo sich das Häkchen befindet oder rechts oder links) der inneren cl ickable Bereich, dann passiert nichts, was, wenn Sie nicht eine separate Farbe haben, ist sehr verwirrend.)
Was ist die richtige Methode, um MenuItems an eine ObservableCollection von ViewModels zu binden, so dass der gesamte Bereich in jedem MenuItem ist anklickbar?
UPDATE:
Also habe ich die folgenden Änderungen auf Beratung basierend unten und jetzt haben diese:
alt text http://tanguay.info/web/external/mvvmMenuItemsYellow.png
ich nur einen Textblock in meinem Datatemplate, aber ich kann immer noch nicht „Farbe das ganze MenuItem“ aber nur den Textblock:
<DataTemplate x:Key="MainMenuTemplate">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
und ich habe die Befehlsbindung in Menu.ItemCo ntainerStyle aber sie jetzt nicht schießen:
<Menu DockPanel.Dock="Top">
<Menu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Command" Value="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"/>
<Setter Property="CommandParameter" Value="{Binding IdCode}"/>
</Style>
</Menu.ItemContainerStyle>
<MenuItem
Header="MVVM" ItemsSource="{Binding MvvmMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
<MenuItem
Header="Application" ItemsSource="{Binding ApplicationMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
<MenuItem
Header="Manage" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>
+1 - sehr schön für das vollständige Beispiel mit Separatoren und alles. –
Ich habe ein sehr ähnliches Design und alles funktioniert bis auf den Separator. Wenn ich die Vorlage zu ändere, sehe ich "Trennzeichen", wo ein Trennzeichen sein sollte. Aber wenn ich versuche, die Vorlage wie in Ihrer Antwort zu verwenden, wird nichts angezeigt. Ich habe versucht, und dann ist das Trennzeichen sichtbar, aber ich möchte den Standard-Stil mit der Breite dynamisch durch die Menübreite festgelegt. Soll ich SeparatorStyleKey irgendwo definieren? Ich suchte online, konnte aber nichts finden, was half ...Vielen Dank! –
Dina