【发布时间】:2009-05-26 15:09:43
【问题描述】:
我有一个场景,我需要同时拥有静态和动态菜单项。静态项将在 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,它在 UI 上显示为一个包含更多菜单项的菜单项,因此动态菜单项的整个集合都被选中当您单击该项目时。集合得到正确表示,因为每个动态菜单项都显示为菜单项本身,但在这个更大的菜单项中。我想我明白为什么菜单只是为每个包含的项目创建一个菜单项,静态或动态它并不关心。有没有办法让每个动态菜单项与示例中的静态菜单项在同一级别上创建并属于父菜单项?
【问题讨论】: