لم يتم استدعاء Setter Property مع 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
طريقة أ UITypeEditor
الفئة من المفترض أن يتم استدعاء كتلة setter من العقار.
هذا يقودني الى الجنون. حتى أنني حاولت إضافة Event
إلى ListItemsCollection
, ، حتى أنه عند إضافة العناصر ، يمكنني أن يمكنني كل ما أريد مع واجهة المستخدم الخاصة بالسيطرة.
هذا ليس من المفترض أن يكون صعبًا. ما الخطأ الذي افعله؟
المحلول
أحاول إعادة تنظيم موقفك: باستخدام الكود التالي ، أحصل على مربع رسالة يظهر متى أقوم بتحرير القائمة من نافذة VS Property. احذر منك إنشاء القائمة بنفسك. إذا لم تنشئها ، فالإنشاء قائمة مؤقتة يمكنك تحريرها من نافذة الخاصية ، ولكنها لا تقوم بتعيين خاصتك على هذه القائمة (لذلك لن يتم استدعاء 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; }
}
نصائح أخرى
يجب أن تكون خصائص جمع القراءة فقط. إنها المجموعة التي يتم استردادها من خلال getter ، وتعديلها. لا يدخل Setter في ذلك ، لأن ذلك يعني تحديد مجموعة جديدة.