質問

私は、を持っているカスタムコントロールを持っています 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. 。しかし、私がクリックするとき Ok のボタン CollectionEditor のセッター Items プロパティが呼ばれていません。

値が返されたときのafaik EditValue aの方法 UITypeEditor クラスプロパティのセッターブロックは呼び出されるはずです。

これは私を非常識に駆り立てています。追加してみました EventListItemsCollection, 、そのため、アイテムが追加されたとき、コントロールのUIで必要なものは何でもできます。

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

役に立ちましたか?

解決

私はあなたの状況を再現しようとします:次のコードを使用して、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; }
    }

他のヒント

収集プロパティは読み取り専用です。それはゲッターを通じて取得され、調整されたコレクションです。セッターはそれに入ることはありません。なぜなら、それは新しいコレクションを設定することを意味するからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top