在后面的代码中添加子菜单项

时间:2014-04-07 13:02:18

标签: c# wpf

我正在尝试使用子项构建菜单。

我有一个公共界面:

public interface IBaseItem
   {
       string Name { get; set; }
   }

一堂课:

 public class ItemsMenu : IBaseItem

{

  public ObservableCollection<IBaseItem> SubItems { get; set; }
  public string Name { get; set; }

}

一个窗口:

<Window x:Class="WpfApplication19.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"> 

<Grid>    
    <Menu Name="myMenu" DisplayMemberPath="Name"></Menu>
</Grid>

并在代码背后:

using System.Collections.ObjectModel;

namespace WpfApplication19
{
   /// <summary>
   /// Interaction logic for MainWindow.xaml
   /// </summary>
   public partial class MainWindow
   {
      public MainWindow()
      {

         var observableCollection = new ObservableCollection<ItemsMenu>();
         var Item1 = new ItemsMenu
                          {
                             Name = "A"
                          };

         var SubItem1 = new ItemsMenu()
                         {
                            Name = "bbbb"
                         };

         var Item2= new ItemsMenu
         {
            Name = "B"
         };

         Item2.SubItems.Add(SubItem1);



         var Item3= new ItemsMenu
         {
            Name = "C"
         };

         observableCollection.Add(Item1);
         observableCollection.Add(Item2);
         observableCollection.Add(Item3);

         InitializeComponent();
         myMenu.ItemsSource = observableCollection;

      }


   }
}

但是在SubItem2.SubItems.Add(SubItem1);行上我收到了这个错误:

  

调用目标抛出了异常。   对象引用未设置为对象的实例。

我做错的任何提示?

1 个答案:

答案 0 :(得分:1)

在使用之前初始化SubItem2.SubItems

 SubItem2.SubItems = new ObservableCollection<IBaseItem>();

您也可以在ItemsMenu类的构造函数中初始化它。

 public class ItemsMenu : IBaseItem
 {
     public ItemsMenu()
     {
          SubItems = new ObservableCollection<IBaseItem>();
     }
     public ObservableCollection<IBaseItem> SubItems { get; set; }
     public string Name { get; set; }
 }