我有一个具有Items
属性的自定义控件。我已应用EditorAttribute
UITypeEditor
类型CollectionEditor
。
收藏类型:
[Serializable]
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public class ListItemsCollection : CollectionBase
{
// methods
}
控制中的财产声明:
private new ListItemsCollection _Items;
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public new ListItemsCollection Items
{
get
{
return _Items;
}
set
{
_Items = value;
// do other UI changes
}
}
问题:
当我将此控件拖放到设计器表面时,我可以使用PropertyGrid
将项添加到Items属性。但是,当我点击Ok
的{{1}}按钮时,CollectionEditor
属性的设置者没有被调用。
当从Items
类的EditValue
方法返回一个值时,应该调用该属性的setter块。
这让我疯了。我甚至尝试将UITypeEditor
添加到Event
,这样当添加项目时,我可以随心所欲地使用控件的ui。
这不应该很难。我做错了什么?
答案 0 :(得分:1)
集合属性应该是只读的。它是通过getter检索并进行调整的集合。 setter永远不会进入它,因为这意味着设置一个新的集合。
答案 1 :(得分:1)
我尝试重新报告你的情况:使用以下代码,每当我从VS属性窗口编辑列表时,我都会看到一个消息框。请注意,您必须自己创建列表。如果你不创建它,VS创建一个临时列表,您可以从属性窗口编辑,但不会将您的属性设置为此列表(因此永远不会调用您的setter)
public UserControl1()
{
InitializeComponent();
list = new BindingList<ListViewItem>();
list.ListChanged += new ListChangedEventHandler(list_ListChanged);
}
void list_ListChanged(object sender, ListChangedEventArgs e)
{
MessageBox.Show(e.ListChangedType.ToString());
}
private BindingList<ListViewItem> list;
public BindingList<ListViewItem> List1
{
get { return list; }
}