1

プロパティを持つカスタムコントロールがありItemsます。タイプのを適用しEditorAttributeました。UITypeEditorCollectionEditor

コレクションタイプ:

[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
    }
}

問題:
このコントロールをデザイナー画面にドロップすると、を使用してItemsプロパティにアイテムを追加できますPropertyGrid。しかし、プロパティのセッターのOkボタンをクリックしても呼び出されません。CollectionEditorItems

EditValueクラスのメソッドから値が返されるUITypeEditorと、プロパティのsetterブロックが呼び出されることになっています。

これは私を狂わせています。Eventに'を追加してみListItemsCollectionたので、アイテムが追加されたときに、コントロールのUIを使用して好きなことを実行できます。

これは難しいことではありません。私は何が間違っているのですか?

4

2 に答える 2

1

コレクションのプロパティは読み取り専用である必要があります。ゲッターを介して取得され、調整されるのはコレクションです。セッターは、新しいコレクションを設定することを意味するため、決してそれには入りません。

于 2010-09-20T12:20:24.953 に答える
1

私はあなたの状況を再現しようとします:次のコードを使用して、VSプロパティウィンドウからリストを編集するたびに表示されるメッセージボックスが表示されます。自分でリストを作成する必要があることに注意してください。作成しない場合、VSはプロパティウィンドウから編集できる一時リストを作成しますが、プロパティをこのリストに設定しません(したがって、セッターが呼び出されることはありません)

    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; }
    }
于 2010-09-20T12:36:14.747 に答える