Domanda

Ho un controllo personalizzato che dispone di una proprietà Items. Ho applicato un EditorAttribute con un UITypeEditor di tipo CollectionEditor.

Raccolta Tipo:

[Serializable]
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public class ListItemsCollection : CollectionBase
{
    // methods
}

immobili Dichiarazione nel controllo:

private new ListItemsCollection _Items;

[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public new ListItemsCollection Items
{
    get
    {
        return _Items;
    }
    set
    {
        _Items = value;

        // do other UI changes
    }
}

Problema:
Quando ho cadere questo controllo sulla superficie di progettista, sono in grado di aggiungere elementi alla proprietà Items utilizzando il PropertyGrid. Ma, il quando si fa clic sul pulsante Ok del CollectionEditor setter della proprietà Items non è sempre chiamato.

Per quanto ne sappia quando un valore viene restituito dal metodo EditValue di una classe UITypeEditor si suppone che il blocco setter della proprietà di essere chiamato.

Questa è la guida mi folle. Ho anche provato ad aggiungere Event di al ListItemsCollection, in modo che quando vengono aggiunti elementi, posso quello che voglio con ui del controllo.

Questo non dovrebbe essere difficile. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

cerco di reprodeuce situazione: utilizzando seguente codice, ottengo una finestra di messaggio che mostra ogni volta che posso modificare l'elenco dal finestra delle proprietà VS. Attenzione che è necessario creare la lista da soli. Se non si crea esso, VS creare una lista di temperatura, che è possibile modificare dalla finestra di proprietà, ma non imposta la vostra proprietà a questa lista (in modo che il setter non verrà mai chiamato)

    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; }
    }

Altri suggerimenti

proprietà Collection dovrebbe essere di sola lettura. E 'la collezione che viene recuperata attraverso il getter, e regolato. Il setter non entra mai in esso, perché ciò significherebbe impostando una nuova collezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top