3

这是我关于 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。
不,我不认为这是一个重复的问题,因为我认为上述来源缺少我理解所固有的关键部分。如果这在某种程度上是重复的,如果有人能指出我错过的信息,我将不胜感激。

我为这件事的琐碎和了解我的大脑而道歉,答案可能真的很简单,但我真的在这里无能为力,所以任何和所有的答案都将不胜感激。

4

2 回答 2

0

最简单的解决方案:DataContext在窗口的构造函数中设置:

public class MainWindow: Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();
    }
}
于 2013-05-14T02:54:39.277 回答
0

您可以DataContext通过将其放在您的窗口定义中来设置 XAML 中的整个窗口,例如在您的下面</Window.Resources>

<Window.DataContext>
    <vm:MenuItemViewModel/>
</Window.DataContext>
于 2015-09-07T12:02:18.173 回答