プロパティセッターは、CollectionEditorで呼び出されません
-
04-10-2019 - |
質問
私は、を持っているカスタムコントロールを持っています 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
クラスプロパティのセッターブロックは呼び出されるはずです。
これは私を非常識に駆り立てています。追加してみました Event
に ListItemsCollection
, 、そのため、アイテムが追加されたとき、コントロールの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; }
}
他のヒント
収集プロパティは読み取り専用です。それはゲッターを通じて取得され、調整されたコレクションです。セッターはそれに入ることはありません。なぜなら、それは新しいコレクションを設定することを意味するからです。