不使用CollectionEditor调用属性设置器

时间:2010-09-20 12:15:24

标签: c# winforms uitypeeditor collectioneditor

我有一个具有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。

这不应该很难。我做错了什么?

2 个答案:

答案 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; }
    }