File: PropertyGridExt.cs
Web Access
Project: src\src\System.Windows.Forms\tests\IntegrationTests\DesignSurface\DesignSurfaceExt\DesignSurfaceExt.csproj (DesignSurfaceExt)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.ComponentModel.Design;
using System.Reflection;
using System.Windows.Forms;
 
namespace DesignSurfaceExt;
 
public class PropertyGridExt : PropertyGrid
{
    private IDesignerHost _host;
    private IComponentChangeService _componentChangeService;
 
    private IComponentChangeService ComponentChangeService
    {
        get
        {
            _componentChangeService ??= (IComponentChangeService)_host.GetService(typeof(IComponentChangeService));
            return _componentChangeService;
        }
    }
 
    private void OnComponentChanged(object sender, ComponentChangedEventArgs e)
    {
        MethodInfo methodInfo = typeof(PropertyGrid).GetMethod(nameof(OnComponentChanged), BindingFlags.NonPublic | BindingFlags.Instance);
        methodInfo.Invoke(this, [sender, e]);
    }
 
    protected override void Dispose(bool disposing)
    {
        if (_componentChangeService is not null)
        {
            _componentChangeService.ComponentChanged -= OnComponentChanged;
        }
 
        base.Dispose(disposing);
    }
 
    public IDesignerHost DesignerHost
    {
        get
        {
            return _host;
        }
        set
        {
            if (_host == value)
            {
                return;
            }
 
            _host = value;
 
            if (ComponentChangeService is null)
            {
                return;
            }
 
            if (value is not null)
            {
                ComponentChangeService.ComponentChanged += OnComponentChanged;
            }
            else
            {
                ComponentChangeService.ComponentChanged -= OnComponentChanged;
            }
        }
    }
 
    protected override void OnSelectedObjectsChanged(EventArgs e) => base.OnSelectedObjectsChanged(e);
 
    protected override object GetService(Type service) => DesignerHost?.GetService(service) ?? base.GetService(service);
}