使用MVVM抛出异常绑定Menu

时间:2014-05-08 11:53:25

标签: c# wpf xaml mvvm

在我的视图中,我有一个菜单控件绑定到我的ViewModel属性,因为我想动态填充它。我为我的菜单创建了一个单独的类。 这是我的菜单类:

 public class MenuItemViewModel : ViewModelBase
 {
    internal MenuItemViewModel()
    {
    }

    private string _menuText;
    public string MenuText
    {
        get { return _menuText; }
        set
        {
            if (_menuText == value)
                return;

            _menuText = value;
            RaisePropertyChanged("MenuText");
        }
    }

    private ObservableCollection<MenuItemViewModel> _children;
    public ObservableCollection<MenuItemViewModel> Children
    {
        get { return _children; }
        set
        {
            _children = value;
            RaisePropertyChanged("Children");
        }
    }

}

在我的MainViewModel中,我创建了MenuItemViewModel的Collection属性 这是我的MainViewModel:

 public class MainViewModel : ViewModelBase
 {
    public MainViewModel()
    {
        LoadMainMenu();
    }

    #region Menu

    private ObservableCollection<MenuItemViewModel> _topMenuItems;
    public ObservableCollection<MenuItemViewModel> TopMenuItems
    {
        get { return _topMenuItems; }
        set
        {
            if (_topMenuItems == value)
                return;

            _topMenuItems = value; 
            RaisePropertyChanged("TopMenuItems");
        }
    }

    public void LoadMainMenu()
    {
        IList<MenuItemViewModel> fileMenuItems = PopulateFileMenuEntries();
       _topMenuItems.Add(new MenuItemViewModel() { MenuText = "_File", Children = new ObservableCollection<MenuItemViewModel>(fileMenuItems) });
    }

    private IList<MenuItemViewModel> PopulateFileMenuEntries()
    {
        List<MenuItemViewModel> fileMenuItems = new List<MenuItemViewModel>();
        fileMenuItems.Add(new MenuItemViewModel() { MenuText = "Open _Recent" });

        return fileMenuItems;
    }

}

这是我的XAML:

 <Window.Resources>
    <WpfApplication3_ViewModel:MainViewModel x:Key="MainViewModelDataSource"
                                             d:IsDataSource="True" />
</Window.Resources>
 <Grid DataContext="{StaticResource MainViewModelDataSource}">
    <Menu
          ItemsSource="{Binding TopMenuItems}"
          Margin="12,0,50,237">
        <Menu.Resources>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="Header"
                        Value="{Binding MenuText}" />
                <Setter Property="ItemsSource"
                        Value="{Binding Children}" />

                <Style.Triggers>
                    <DataTrigger Binding="{Binding }"
                                 Value="{x:Null}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Separator Style="{StaticResource {x:Static MenuItem.SeparatorStyleKey}}" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Menu.Resources>
    </Menu>
</Grid>

当应用程序运行时,它抛出异常&#34;调用目标抛出了异常。&#34;

我的代码有什么问题

1 个答案:

答案 0 :(得分:1)

我有类似的问题,我将其追踪到一个未初始化的变量。您_topMenuItems中的Constructor应为

new ObservableCollection<MenuItemViewModel>()

ObservableCollection<MenuItemViewModel> _topMenuItems = new ObservableCollection<MenuItemViewModel>();