У меня есть сценарий, в котором мне нужно иметь как статические, так и динамические пункты меню. Статические элементы будут определены в XAML, а динамические - в модели представления. Каждый динамический элемент будет представлен VieModel, назовем его CommandViewModel.
CommandViewModel имеет среди прочего отображаемое имя, оно также может содержать другие CommandViewModel.
MainViewModel, который используется как текстовый текст для меню, выглядит следующим образом:
public class MainMenuViewModel : INotifyPropertyChanged
{
private ObservableCollection<CommandViewModel> m_CommandVMList;
public MainMenuViewModel()
{
m_ CommandVMList = new ObservableCollection<CommandViewModel>();
CommandViewModel cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 1";
m_CommandVMList.Add(cmv);
cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 2";
m_CommandVMList.Add(cmv);
cmv = new CommandViewModel();
cmv.DisplayName = "Dynamic Menu 3";
m_CommandVMList.Add(cmv);
}
public ObservableCollection<CommandViewModel> CommandList
{
get { return m_CommandVMList; }
set
{
m_CommandVMList = value;
OnPropertyChanged("CommandList");
}
}
...
...
...
Меню XAML:
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate DataType="{x:Type Fwf:CommandViewModel}" ItemsSource="{Binding Path=CommandViewModels}">
<MenuItem Header="{Binding Path=DisplayName}"/>
</HierarchicalDataTemplate>
</Grid.Resources>
<Menu VerticalAlignment="Top" HorizontalAlignment="Stretch">
<MenuItem Header="Static Top Menu Item 1">
<MenuItem Header="Static Menu Item 1"/>
<MenuItem Header="Static Menu Item 2"/>
<MenuItem Header="Static Menu Item 3"/>
<ItemsControl ItemsSource="{Binding Path= CommandList}"/>
<MenuItem Header="Static Menu Item 4"/>
</MenuItem>
</Menu>
</Grid>
Все работает нормально, за исключением того, что независимо от того, что я пытаюсь представить в списке динамических меню, в данном случае ItemsControl отображается в пользовательском интерфейсе как ОДИН пункт меню, содержащий больше элементов меню, поэтому выбирается весь набор динамических пунктов меню когда вы нажимаете на элемент. Коллекция корректно представлена в том смысле, что каждый динамический элемент меню отображается как сам элемент меню, но внутри этого большего элемента меню. Я думаю, я понимаю, почему, поскольку Меню просто создает пункт меню для каждого из содержащихся в нем элементов, статических или динамических, ему все равно. Есть ли способ, чтобы каждый динамический элемент меню создавался на том же уровне и принадлежал к родительскому элементу меню, как статические элементы в примере?