Property Setter nicht mit Collection immer genannt
-
04-10-2019 - |
Frage
habe ich ein benutzerdefiniertes Steuerelement, das eine Items
Eigenschaft hat. Ich habe eine EditorAttribute
mit einem UITypeEditor
vom Typ CollectionEditor
angewandt.
Sammlung Typ:
[Serializable]
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public class ListItemsCollection : CollectionBase
{
// methods
}
Property Deklaration in der Steuer:
private new ListItemsCollection _Items;
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public new ListItemsCollection Items
{
get
{
return _Items;
}
set
{
_Items = value;
// do other UI changes
}
}
Problem:
Als ich diese Kontrolle auf die Designer-Oberfläche fallen, bin ich in der Lage, Elemente in die Eigenschaft Items hinzufügen, um die PropertyGrid
verwenden. Aber, das wenn ich auf die Ok
Taste des CollectionEditor
der Setter der Items
Eigenschaft wird nicht genannt zu werden.
AFAIK, wenn ein Wert aus der EditValue
Methode eines UITypeEditor
Klasse der Setzer Block der Eigenschaft zurückgegeben wird, soll genannt werden.
Das treibt mich in den Wahnsinn. Ich habe sogar versucht Event
die zum ListItemsCollection
Zugabe so, dass, wenn Artikel hinzugefügt werden, kann ich alles, was ich mit der ui Kontrolle will.
Das soll nicht schwer sein. Was mache ich falsch?
Lösung
Ich versuche, um Ihre Situation zu reprodeuce: folgenden Code verwenden, erhalte ich ein Meldungsfeld zeigt, wenn ich die Liste von VS Eigenschaftsfenster bearbeiten. Beachten Sie, dass Sie die Liste selbst erstellen müssen. Wenn Sie es nicht schaffen, schaffen VS eine temporäre Liste, die Sie von Eigenschaftsfenster bearbeiten können, aber nicht Ihr Eigentum auf diese Liste gesetzt (so Ihre Setter wird nie genannt werden)
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; }
}
Andere Tipps
Sammlung Eigenschaften sollten nur gelesen werden. Es ist die Sammlung, die durch den Getter abgerufen wird, und eingestellt. Der Setter nie tritt in sie, denn das würde bedeuten, eine neue Kollektion zu setzen.