这是我关于 SO 的第一个问题,所以你好。
我对 WPF 很陌生,所以我决定尝试为我过去创建的库创建一个 GUI。我想为应用程序创建一个菜单条/行/栏,这对菜单控件来说非常简单。但是,我看到提到 MVVM 并进行了查找,并决定我想从集合中动态创建菜单。
这一切都很好,我找到了很多关于这个主题的材料,最后为我的 MenuItems 提供了以下 ViewModel:
class MenuItemViewModel
{
public string Text { get; set; }
public ICommand Command { get; set; }
public ObservableCollection<MenuItemViewModel> Children
{
get
{
return new ObservableCollection<MenuItemViewModel>(children);
}
}
private List<MenuItemViewModel> children;
public MenuItemViewModel()
{
children = new List<MenuItemViewModel>();
}
}
和视图(带附加功能):
<Window x:Class="GUI.MainWindow"
xmlns=""
"
"
Title="HTX-Formler" Height="350" Width="525"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Path=Text}"/>
<Setter Property="Command" Value="{Binding Path=Command}"/>
</Style>
<HierarchicalDataTemplate
DataType="{x:Type vm:MenuItemViewModel}"
ItemsSource="{Binding Path=Children}">
</HierarchicalDataTemplate>
</Window.Resources>
<DockPanel KeyboardNavigation.TabNavigation="None">
<Menu DockPanel.Dock="Top" ItemsSource="{Binding Path=Children}" />
</DockPanel>
据我所知,绑定很好,但无论我做什么,我都无法让菜单显示任何东西。
我有一种感觉是因为我使用了错误的 ItemsSource,所以我尝试执行以下操作:
class MainWindowViewModel
{
#region Fields
ReadOnlyCollection<MenuItemViewModel> _menuItems;
#endregion
#region Menu
public ReadOnlyCollection<MenuItemViewModel> Children
{
get
{
if (_menuItems == null)
{
List<MenuItemViewModel> menuItems = this.PopulateMenu();
_menuItems = new ReadOnlyCollection<MenuItemViewModel>(menuItems);
}
return _menuItems;
}
}
List<MenuItemViewModel> PopulateMenu()
{
return new List<MenuItemViewModel>
{
new MenuItemViewModel()
};
}
#endregion
}
但无济于事。我意识到该集合与 Children 属性具有相同的名称,但更改了 col 的名称。没有效果。
概括
以这种方式创建菜单栏的最佳方法是什么?
填充菜单集合的最佳方式是什么?
大量灵感来自以下来源:
是的,其中一些链接指向 SO。
不,我不认为这是一个重复的问题,因为我认为上述来源缺少我理解所固有的关键部分。如果这在某种程度上是重复的,如果有人能指出我错过的信息,我将不胜感激。
我为这件事的琐碎和了解我的大脑而道歉,答案可能真的很简单,但我真的在这里无能为力,所以任何和所有的答案都将不胜感激。