lusian_andrei
lusian_andrei

Reputation: 117

Add sub menu items in code behind

I'm trying to build a menu with sub items.

I have a public interface:

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

a class:

 public class ItemsMenu : IBaseItem

{

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

}

a window :

<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>

and in code behind:

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;

      }


   }
}

But on line SubItem2.SubItems.Add(SubItem1); i get this error:

Exception has been thrown by the target of an invocation. Object reference not set to an instance of an object.

Any tips where I'm doing it wrong?

Upvotes: 0

Views: 1660

Answers (1)

L-Four
L-Four

Reputation: 13531

Initialize SubItem2.SubItems before you use it.

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

You could also initialize it in the constructor of the ItemsMenu class.

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

Upvotes: 1

Related Questions