public void BuildChildTree(SDEFListing item, SDEFBase current)
        {
            foreach (var entry in current.ChildParameters)
            {
                var listing = new SDEFListing();
                listing.Entry = entry;
                listing.Name  = listing.ToString();
                if (entry.NodeType == NodeType.CustomType)
                {
                    BuildChildTree(listing, entry);
                }
                else if (entry.NodeType == NodeType.CustomTypeArray)
                {
                    SDEFParamArray array = entry as SDEFParamArray;
                    for (int i = 0; i < array.Values.Count; i++)
                    {
                        SDEFBase element         = array.Values[i];
                        var      arrValueListing = new SDEFListing()
                        {
                            Name = $"[{i}] - {array.CustomTypeName}"
                        };
                        BuildChildTree(arrValueListing, element);
                        listing.Items.Add(arrValueListing);
                    }
                }
                else if (entry.NodeType == NodeType.RawValueArray)
                {
                    SDEFParamArray array = entry as SDEFParamArray;
                    for (int i = 0; i < array.RawValuesArray.Length; i++)
                    {
                        SDEFVariant elem            = array.RawValuesArray[i];
                        var         arrValueListing = new SDEFListing()
                        {
                            Name = $"[{i}] - {elem.ToString()}"
                        };
                        arrValueListing.ArrayElement      = elem;
                        arrValueListing.ArrayElementIndex = i;

                        listing.Items.Add(arrValueListing);
                    }
                }

                item.Items.Add(listing);
            }
        }
        private void tv_SDEFListing_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            var item = (SDEFListing)e.NewValue;

            CurrentParameter = item;

            ResetEntryControls();

            if (CurrentParameter?.Entry is null && CurrentParameter?.ArrayElement is null)
            {
                return;
            }

            if (CurrentParameter?.Entry?.NodeType == NodeType.RawValueArray)
            {
                return; // Don't need, its the def, not the values
            }
            if (CurrentParameter?.Entry?.NodeType == NodeType.CustomType || CurrentParameter?.Entry?.NodeType == NodeType.CustomTypeArray)
            {
                paramType.Content = CurrentParameter.Entry.CustomTypeName;
                if (CurrentParameter.Entry != null)
                {
                    parameterName.Content = CurrentParameter.Entry.Name;
                    if (ParamDescription.TryGetValue(CurrentParameter.Entry.Name, out string desc))
                    {
                        parameterDescription.Text = desc;
                    }
                    else
                    {
                        parameterDescription.Text = "No description available";
                    }
                }
            }
            else
            {
                SDEFVariant value = CurrentParameter?.Entry?.NodeType == NodeType.RawValue ? (CurrentParameter.Entry as SDEFParam).RawValue : CurrentParameter.ArrayElement;
                paramType.Content = value.Type.ToString();
                switch (value.Type)
                {
                case Entities.ValueType.Byte:
                    param_Byte.IsEnabled = true;
                    param_Byte.Value     = value.GetByte(); break;

                case Entities.ValueType.SByte:
                    param_SByte.IsEnabled = true;
                    param_SByte.Value     = value.GetSByte(); break;

                case Entities.ValueType.Bool:
                    param_Bool.IsEnabled = true;
                    param_Bool.IsChecked = value.GetBool(); break;

                case Entities.ValueType.Int:
                    param_Integer.IsEnabled = true;
                    param_Integer.Value     = value.GetInt(); break;

                case Entities.ValueType.UInt:
                    param_UInteger.IsEnabled = true;
                    param_UInteger.Value     = value.GetUInt(); break;

                case Entities.ValueType.Float:
                    param_Single.IsEnabled = true;
                    param_Single.Value     = value.GetFloat(); break;

                case Entities.ValueType.Double:
                    param_Double.IsEnabled = true;
                    param_Double.Value     = value.GetDouble(); break;

                case Entities.ValueType.ULong:
                    param_ULong.IsEnabled = true;
                    param_ULong.Value     = value.GetULong(); break;

                case Entities.ValueType.String:
                    param_String.IsEnabled = true;
                    param_String.Text      = value.GetString(); break;

                default:
                    break;
                }

                if (CurrentParameter.Entry != null)
                {
                    parameterName.Content = CurrentParameter.Entry.Name;
                    if (ParamDescription.TryGetValue(CurrentParameter.Entry.Name, out string desc))
                    {
                        parameterDescription.Text = desc;
                    }
                    else
                    {
                        parameterDescription.Text = "No description available";
                    }
                }
            }
        }