setter proprietà non sempre chiamato con CollectionEditor
-
04-10-2019 - |
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?
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.