private void notifyMultilevelPropertyChangedHandler(string fullPropertyName, MultilevelPropertyChangeObserver observer)
        {
            object[] tagData = observer.Tag as object[];
            if ((tagData == null) || (tagData.Length != 2))
            {
                return;
            }
            DataGridViewCell cell = tagData[0] as DataGridViewCell;
            CustomDataGridViewColumnDescriptor <T> columnDescriptor = tagData[1] as CustomDataGridViewColumnDescriptor <T>;

            if (cell == null)
            {
                return;
            }
            columnDescriptor.UpdaterMethod?.Invoke(item, cell);
        }
        private void subscribeToMultilevelItemEvents()
        {
            INotifyPropertyChanged itemCastedINotifyPropertyChanged = item as INotifyPropertyChanged;

            if (itemCastedINotifyPropertyChanged == null)
            {
                return;
            }
            for (int i = 0; i < cells.Count; i++)
            {
                DataGridViewCell cell = cells[i];
                CustomDataGridViewColumnDescriptor <T> columnDescriptor = table.ColumnDescriptors[i];
                foreach (string[] eventNames in columnDescriptor.MultilevelChangeEvents)
                {
                    object[] tagData = new object[] { cell, columnDescriptor };
                    MultilevelPropertyChangeObserver multilevelObserver = new MultilevelPropertyChangeObserver(itemCastedINotifyPropertyChanged, eventNames, tagData);
                    multilevelObserver.MultilevelPropertyChanged += notifyMultilevelPropertyChangedHandler;
                }
            }
        }