Похоже, я нашел решение для части моей проблемы. Команда не является обязательной, потому что, похоже, нам нужно создать конкретный экземпляр команды для каждого пункта меню. Основная проблема заключается в том, что почти все мои пункты меню выполняют одну и ту же команду, а различия заключаются только в значении параметра команды. Поэтому я должен сделать это:
образец класса меню:
public class RMyMenuItem
{
public string Name { get; set; }
public string InputGesture { get; set; }
public ICommand ItemCommand
{ get; set; }
public List<RMyMenuItem> ChildrenItems { get; set; }
}
свойство во ViewModel:
public ObservableCollection<RMyMenuItem> ApplicationMenu
{
get
{
//RApplicationMainMenu menu = new RApplicationMainMenu(0);
//return new ObservableCollection<RMenuItem>(menu.Items);
return new ObservableCollection<RMyMenuItem>()
{
new RMyMenuItem()
{
Name = "item1",
ItemCommand = new DelegateCommand((param) => RunOperationExecute(param)),
ChildrenItems = new List<RMyMenuItem>()
{
new RMyMenuItem()
{
Name = "item2",
ItemCommand = new DelegateCommand((param) => RunOperationExecute(param))
}
}
}
};
}
И XAML:
<Menu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Name}" />
<Setter Property="MenuItem.Command" Value="{Binding ItemCommand}"/>
<Setter Property="MenuItem.CommandParameter" Value="123"/>
<Setter Property="ItemsSource" Value="{Binding ChildrenItems}" />
</Style>
</Menu.ItemContainerStyle>
}