'WPF designer properties window: property does not show nested properties

I am trying to edit a complex property of a WPF custom UserControl in the properties windows. But, the nested properties of the property are not always expandable. In the verbose form (don't know the corrent name):

<local:PointControl>
    <local:PointControl.Point>
        <local:Point X="3" Y="4"/>
    </local:PointControl.Point>
</local:PointControl>

I can edit the nested properties:

Editable nested properties

In the short form, provided by a TypeConverter:

<local:PointControl Point="0,0"/>

I cannot edit the nested properties:

enter image description here

The code is as follows:

Point

namespace WpfApplication1
{
    [TypeConverter(typeof(PointConverter))]
    public class Point
    {
        public int X { get; set; }

        public int Y { get; set; }

        public Point() { }

        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }

        public static bool CanParse(string value); // not important
        public static Point Parse(string value); // not important
        public override string ToString()
        {
            return string.Format("{0},{1}",X,Y);
        }
    }
}

PointConverter

namespace WpfApplication1
{
    public class PointConverter : TypeConverter
    {
        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            return destinationType == typeof(string);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (value is Point)
            {
                return (value as Point).ToString();
            }

            return base.ConvertTo(context, culture, value, destinationType);
        }

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); ;
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
            {
                var point = Point.Parse(value as string);
                return point;
            }

            return base.ConvertFrom(context, culture, value);
        }

        public override bool IsValid(ITypeDescriptorContext context, object value)
        {
            if (!(value is string))
            {
                return false;
            }

            return Point.CanParse(value as string);
        }
    }
}

UserControl

namespace WpfApplication1
{
    public partial class PointControl : UserControl
    {
        public Point Point
        {
            get;set;
        }

        public PointControl()
        {
            InitializeComponent();
        }
    }
}

UPDATE

When I add an inline value editor it won't update the XAML... :(.

enter image description here

xaml:

<local:PointControl Point="2,2">

MetaData.cs

[assembly: ProvideMetadata(typeof(WpfApplication1.Design.Metadata))]

namespace WpfApplication1.Design
{
    internal class Metadata : IProvideAttributeTable
    {
        public AttributeTable AttributeTable
        {
            get
            {
                AttributeTableBuilder builder = new AttributeTableBuilder();

                builder.AddCustomAttributes(typeof(WpfApplication1.PointControl), nameof(WpfApplication1.PointControl.Point), PropertyValueEditor.CreateEditorAttribute(typeof(PointerValueEditor)));

                return builder.CreateTable();
            }
        }
    }
}

PointerValueEditor

namespace WpfApplication1.Design
{
    class PointerValueEditor : PropertyValueEditor
    {
        public PointerValueEditor()
        {
            var stringReader = new System.IO.StringReader(
@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
    <StackPanel>
        <TextBox Text=""{Binding Value.X, Mode=TwoWay, UpdateSourceTrigger=LostFocus}""/>
        <TextBox Text=""{Binding Value.Y, Mode=TwoWay, UpdateSourceTrigger=LostFocus}""/>
    </StackPanel>
</DataTemplate>");
            var xmlReader = System.Xml.XmlReader.Create(stringReader);
            var dataTemplate = System.Windows.Markup.XamlReader.Load(xmlReader) as DataTemplate;

            this.InlineEditorTemplate = dataTemplate;
        }
    }
}

The Code is based on https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/ayybcxe5(v=vs.120)



Solution 1:[1]

You will want to implment an inline value editor

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 aydjay