用户控件的数据源

我正在建立一个用户控件。 目前它由一个文本框和一个按钮组成 – 作为一种学习体验。 这将用作更有用的控制的基础。

我想添加一个DataSource,显示成员和ValueMember。
这是我的数据源代码。 它将显示在“属性”编辑器中,但已禁用并显示为灰色。 我错过了什么?

private object MyDataSource; [Browsable(true)] [TypeConverter("System.Windows.Forms.Design.DataSourceConverter")] [System.ComponentModel.Bindable(true)] public object DataSource { get { return MyDataSource; } set { if (MyDataSource != value) MyDataSource = value; } } 

更简单的选择可能是使用属性提供程序:

 [AttributeProvider(typeof(IListSource))] 

您可以尝试使用程序集限定名称吗? 并指定编辑器?

 [TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [Editor("System.Windows.Forms.Design.DataSourceListEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] 

实际上,只需指定程序集,就可以将其缩写为与版本无关:

 [TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design")] [Editor("System.Windows.Forms.Design.DataSourceListEditor, System.Design", typeof(UITypeEditor))] 

我将ComplexBindingProperties属性添加到我的Control类中,并将AttributeProvider添加到我的DataSource属性中

 [ComplexBindingProperties("DataSource", "DataMember")] public partial class SomeListControl : UserControl 

 [Category("Data")] [Description("Indicates the source of data for the control.")] [RefreshProperties(RefreshProperties.Repaint)] [AttributeProvider(typeof(IListSource))] public object DataSource { get { return _ultraGrid.DataSource; } set { _ultraGrid.DataSource = value; } } [Category("Data")] [Description("Indicates a sub-list of the data source to show in the control.")] [Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(UITypeEditor))] public string DataMember { get { return _ultraGrid.DataMember; } set { _ultraGrid.DataMember = value; } } 

参考: 在Windows窗体控件中应用属性