如何在设计时在控件 属性 的下拉列表中列出窗体上 typeX 组件的所有实例

How to list all instances of a component of typeX on a form in a drop down of a control property in design time

以下情况:

我有一个名为 ButtonGroupStyleController 的组件 class 和一个名为 EnhancedButton 的控件 class 属性:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Browsable(true)]
public ButtonGroupStyleController StyleController { get; set;}

在表单设计器的设计期间,我现在想在 属性 网格中为此 属性 填充当前放置的所有 ButtonGroupStyleController 实例的下拉列表在类似于标准表单属性 AcceptButtonCancelButton 的表单上,它们列出了表单上的所有 Button 实例。

我希望我描述的问题清晰易懂。

STyleControllerCode目前几乎是空的,因为我想先实现问题中的功能

namespace DarkTower.Core.Rendering.Forms
{
    [Serializable]
    public class ButtonGroupStyleController : Component, INotifyPropertyChanged
    {
        public ButtonGroupStyleController()
        {

        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

根据我的测试,你可以定义如下class来显示设计时的实例列表。

public class EnhancedButton:Button
    {

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [Browsable(true)]
        public ButtonGroupStyleController StyleController { get; set; }

    }

 [Serializable]
    public class ButtonGroupStyleController : Component, INotifyPropertyChanged
    {

        public ButtonGroupStyleController()
        {
            this.Text = "Hi Winform";
        }
        private string text;

        public string Text
        {
            get { return text; }
            set
            {
                text = value;
                OnPropertyChanged("Text");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        //[NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName=null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            
        }

    }

添加两个 class 后,请重建项目并从工具箱中将 EnhanceButton 和 ButtonGroupStyleController 添加到表单中。

最后,请找到属性调用的stylecontroller,你会看到结果。