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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top