colocador propiedad no recibiendo llamadas con CollectionEditor
-
04-10-2019 - |
Pregunta
Tengo un control personalizado que tiene una propiedad Items
. He aplicado un EditorAttribute
con un UITypeEditor
de tipo CollectionEditor
.
Colección Tipo:
[Serializable]
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public class ListItemsCollection : CollectionBase
{
// methods
}
Propiedad Declaración en el control:
private new ListItemsCollection _Items;
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public new ListItemsCollection Items
{
get
{
return _Items;
}
set
{
_Items = value;
// do other UI changes
}
}
Problema:
Cuando se me cae este control a la superficie del diseñador, soy capaz de añadir elementos a la propiedad Items utilizando el PropertyGrid
. Pero, cuando el clic en el botón de la Ok
CollectionEditor
la incubadora de la propiedad Items
no está recibiendo llamadas.
Que yo sepa cuando un valor se devuelve desde el método EditValue
de una clase UITypeEditor
se supone que el bloque de setter de la propiedad de ser llamado.
Esto me está volviendo loco. Incluso he intentado añadir Event
de la ListItemsCollection
, de modo que cuando se añaden artículos, puedo lo que quiera con la interfaz de usuario del control.
Esto no se supone que es duro. ¿Qué estoy haciendo mal?
Solución
Trato de reprodeuce su situación: el uso de código siguiente, aparece un cuadro de mensaje que muestra cada vez que editar la lista de VS ventana de propiedades. Tenga en cuenta que usted tiene que crear la lista por sí mismo. Si usted no lo crea, VS crear una lista temporal que se puede editar desde la ventana de la propiedad, pero no establece su propiedad a esta lista (por lo que su setter nunca será llamado)
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; }
}
Otros consejos
Las propiedades de colección debe ser de sólo lectura. Es la colección que se recupera a través del captador y ajustado. El colocador nunca entra en ella, porque eso significaría el establecimiento de una nueva colección.