2009-07-15 3 views
1

Eigentlich habe ich ein UserControl geschrieben, das als Container für andere (nennen wir es) NestedUserControls dient.Beste 'Verbindung' zwischen MyUserControl.List <NestedControl> und MyUserControl.Panel.Controls

Ich implementierte eine programmgesteuerte Möglichkeit zum Hinzufügen solcher NestedUserControls zu meinem UserControl (über eine App(string name)-Funktion). Aber was ich eigentlich lieber hätte, wäre eine Art List als öffentliche Eigenschaft für mein UserControl.

Aber das Problem ist, dass mein NestedUserControl in die private UserControl.panel.Controls Liste eingefügt werden muss. In meiner eigenen geschriebenen Add() Funktion ist dies kein großes Problem. Aber wie kann ich dieses Problem lösen, wenn ich die List<NestedUserControl> Eigenschaft verwende? Ich bekomme keine Informationen darüber, wann sich die Liste irgendwie ändert.

Die einzige Idee, die ich tatsächlich gefunden würde wäre, eine Art von EventList<> zu erstellen, die ein Ereignis auslöst, wenn die Liste geändert wird. Also wäre das der richtige Weg oder habt ihr bessere Ansätze (oder vielleicht gibt es bereits eine Art EventList in .Net Framework?

Oh, bevor ich es vergesse: Ich benutze VS2008, C#, WinForms, .Net 3.5 SP1

+0

WinForms, WebForms, WPF, SilverLight? –

Antwort

0

So mehr clearity innerhalb dieses Problem zu umgehen, hier meine Lösung:

, was ich zu tun gemocht hatte, eine Liste meiner UserControlContainer Zugabe, die leicht zur Laufzeit oder Design geändert werden kann -Zeit. Damit es korrekt mit Entwurfszeit funktioniert, musste ich von CollectionBase statt List <> erben und das DesignerSerializationVisibility (DesignerSerializationVisibility.Content) -Attribut hinzufügen. Die CollectionBase selbst bietet einige Ereignisse für Einfügen, Entfernen und Löschen.

Nach dem Implementieren dieser Funktionen und dem Hinzufügen eines eigenen definierten Ereignisses ListChangedEvent in die Außenwelt konnte ich Informationen über jede Listenänderung erhalten.

Das einzige Problem, das Sie haben werden, ist, dass der CollectionEditor keine Objekte aus Ihrer Liste löscht. Stattdessen scheint es mit einer zweiten internen Liste zu arbeiten. Nachdem Sie auf OK geklickt haben, wird Ihre Liste gelöscht und mit den anderen Ereignissen gefüllt. Verpassen Sie nicht die Funktionen CollectionBase.OnClear oder CollectionBaseOnClearComplete!

1

Wenn ich Ihre Frage richtig verstanden hat, entweder Sie eine beobachtbare Sammlung zum Speichern von verschachtelten Benutzersteuerungen verwenden müssen, leider ist der einzige, den ich kenne in WPF Montage ist: http://msdn.microsoft.com/en-us/library/ms668604.aspx oder vorzugsweise aussetzen Nur IList<NestedUserControl> an die Benutzer Ihrer Benutzersteuerung, und implementieren Sie diese Schnittstelle in einer Weise, dass es die meiste Arbeit an UserControl.panel.Controls delegiert. Ein Beispiel, wie IList zu implementieren: http://damieng.com/blog/2006/06/14/Observing_change_events_on_a_ListT

+0

Zuerst verstehst du meine Frage richtig. ;-) Ich habe auch die beobachtbare Sammlung gefunden und zwar nur in WPF. Das ist also nicht für mich verfügbar. :-(Deine zweite Vermutung ist, was mir auch in den Sinn kommt (mit der eigenen geschriebenen EventList-Klasse). Vielleicht hat jemand anderes eine andere Idee ... – Oliver