1

When I run the program and wanna execute the command "DeleteNodeCommand", I get the following Exception:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

Can someone help me with this Exception please? I'm a new to C# and I never had this exception before.

Here is all my code in my program:

ViewModel:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using Test.Models;
using Test.Views;

namespace Test.ViewModels
{
    public class VMSubTabOverzicht : ObservableObject
    {
        private readonly object sender;
        private readonly RoutedEventArgs e;

        public ObservableCollection<ModelSubTabOverzicht> Hoofdborden { get; set; }

        public RelayCommand ChangeNameNodeCommand { get { return new RelayCommand(x => { ChangeNameNode(); }); } }
        public RelayCommand CreateNewNodeCommand { get { return new RelayCommand(x => { CreateNewNode(sender, e) ; }); } }
        public RelayCommand DeleteNodeCommand { get { return new RelayCommand(x => { DeleteNode(); }); } }

        public VMSubTabOverzicht()
        {
            Hoofdborden = new ObservableCollection<ModelSubTabOverzicht>()
            {
                new ModelSubTabOverzicht()
                {
                    Name="ALSB",
                    Items = new ObservableCollection<ModelSubTabOverzicht>()
                    {
                        new ModelSubTabOverzicht (){Name="EB 1"}
                    }
                }
            };
        }

        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set
            {
                if (value != _isSelected)
                {
                    _isSelected = value;
                    this.OnPropertyChanged("IsSelected");
                }
            }
        }

        private void ChangeNameNode()
        {

        }
        private void CreateNewNode(object sender, RoutedEventArgs e)
        {
            Hoofdborden.Add(new ModelSubTabOverzicht() { Name = "Nieuw werkblad"});
        }
        private void DeleteNode()
        {
            ModelSubTabOverzicht item = (sender as TreeViewItem).DataContext as ModelSubTabOverzicht;
            item.FindDirectParent(Hoofdborden).Remove(item);
        }
    }
}

Model:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Windows.Controls;

namespace Test.Models
{
    public class ModelSubTabOverzicht : ObservableObject
    {
        private string name;
        public string Name
        {
            get
            { 
                return this.name; 
            }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }

        public ModelSubTabOverzicht Parent { get; set; }
        public ObservableCollection<ModelSubTabOverzicht> Items { get; set; }

        public ObservableCollection<ModelSubTabOverzicht> FindDirectParent(ObservableCollection<ModelSubTabOverzicht> _items)
        {
            ObservableCollection<ModelSubTabOverzicht> ret = new ObservableCollection<ModelSubTabOverzicht>();
            if (_items.Contains(this) == true)
            {
                ret = _items;
            }
            else
            {
                foreach (ModelSubTabOverzicht item in _items)
                {
                    if (item.Items != null && item.Items.Contains(this) == true)
                        ret = FindDirectParent(item.Items);
                }
            }
            return ret;
        }
    }
}
sayah imad
  • 1,507
  • 3
  • 16
  • 24
A.N.
  • 21
  • 4

1 Answers1

0

The NullReferenceException is a very know exception caused when you try to acess a member on a type whose value is null in your case we haven't the stacktrace resaon why we dont know by what is caused, what we can do is to check if your variables are null .

The Basic Way to check your variable :

private void DeleteNode()
{
        TreeViewItem item = (sender as TreeViewItem);

        if (item !=null) 
        {
            ModelSubTabOverzicht item1 = item.DataContext as ModelSubTabOverzicht;
            if (item1 != null)
            {
                var parteItem = item1.FindDirectParent(Hoofdborden);
                if (parteItem! = null)
                    parteItem.Remove(item1);
            }
        }
}

Since .Net Framework 4.6 you can use Elvis Operator :

private void DeleteNode()
{
    ModelSubTabOverzicht item = (sender as TreeViewItem)?.DataContext as ModelSubTabOverzicht;
    item?.FindDirectParent(Hoofdborden)?.Remove(item);
}
sayah imad
  • 1,507
  • 3
  • 16
  • 24
  • Thanks for your quick response! The exception is thrown in this line: `ModelSubTabOverzicht item = (sender as TreeViewItem).DataContext as ModelSubTabOverzicht;` So unfortunately this is not a solution for the problem ... – A.N. Aug 02 '20 at 12:00
  • that mean that your sender is not a TreeViewItem , my reponse will be update – sayah imad Aug 02 '20 at 12:04
  • @A.N. now it's suppose to answer to your question . – sayah imad Aug 02 '20 at 12:09
  • Thank you for your help! I don't get the exception anymore. But now the command doesn't do what it should do ... – A.N. Aug 02 '20 at 12:36
  • you need to check your sender – sayah imad Aug 02 '20 at 12:52
  • How do you mean? Sorry for my questions, I'm new to this subjects of WPF. – A.N. Aug 02 '20 at 12:59
  • you try to cast your sender to TreeViewItem , probably you are trying to cast you sender to the wrong item reason why you have null. – sayah imad Aug 02 '20 at 13:08