Ich habe eine KontrolleWPF - Bindung eine ObservableCollection Abhängigkeitseigenschaft innerhalb eines Usercontrol
Klasse DragGrid: Gitter { ... }
, die aus dem ursprünglichen Raster erbt und ermöglicht Drag und Ändern der Größe seiner untergeordneten Elemente. Ich brauche eine benutzerdefinierte zu binden DP namens WorkItemsProperty
zu einer beobachtbaren Sammlung von Typ WorkItem
(implementiert INotifyPropertyChanged
). Jedes Element im Raster ist an ein Sammlungselement gebunden.
Wenn der Benutzer dynamisch ein neues Element zur Laufzeit hinzufügt (die Elemente können nicht in XAML deklariert werden!) Oder löscht ein Element aus dieser Auflistung, sollte die WorkItems
DP auf dem DragGrid aktualisiert werden, und die untergeordneten Elemente im Raster (wobei jedes Kind einen WorkItem
Sammelgegenstand darstellt).
Meine Frage ist, wie funktioniert die DP die Steuerung mitteilen, über die untergeordnete Element in dem Gitter entfernt werden muss, geändert (‚Änderung‘ Benutzer ein Element gezogen wird, oder die Größe veränderte es mit der Maus) oder hinzugefügt, und wie würde ich identifizieren, welches der vorhandenen Kinder das ist, das gelöscht oder geändert werden muss. Ich verstehe, dass hier die DependencyPropertyChangedCallback kommt. Aber das wird nur aufgerufen, wenn die DP-Eigenschaft neu festgelegt wird, nicht wenn etwas innerhalb der Sammlung ändert (wie hinzufügen, entfernen Sie Element). Also, am Ende, muss die DragGrid
Steuerung irgendwie das CollectionChanged-Ereignis abonnieren? An welchem Punkt würde ich den Event-Handler dafür anschließen?
* EDIT :: Der Grund, ein Gitter in erster Linie für den Einsatz ist, weil ich in der Lage sein wollen, für ein Minimum Delta zu halten, wenn der Benutzer zieht oder passt die Steuerung im Grid. Ein Steuerelement stellt eine Zeitspanne dar, und jede Rasterspalte repräsentiert 15 Minuten (das ist der Mindestwert). Dies in einem Canvas mit Thumbs zu tun war schwierig und fehlerhaft. Das Implementieren eines DragGrid löste meine Benutzerinteraktionsprobleme. Außerdem ist ein Canvas nicht skalierbar, daher müssten die Zeitspannen ständig neu berechnet werden. Mit dem Grid habe ich das Problem nicht, da die Spalten mir die Uhrzeit egal welche Größe sagen. **
Josh, danke dafür. Im collectionchanged-Ereignis kann ich der internen Auflistung von Arbeitselementen nicht hinzufügen, da .NET dies nicht zulässt. Ich denke, was Sie hier gemeint haben, ist, die Steuerelemente der Children-Kollektion des Rasters hinzuzufügen. – John
Nein, eigentlich meinte ich es zu deiner Sammlung hinzuzufügen + der Children-Sammlung des Rasters oder etc. Ich bin mir nicht sicher, wie genau deine Kontrolle funktioniert, aber es ist offensichtlich, dass du Arbeit machst, um eine Sammlung von Gegenständen zu verwalten. Basierend auf Ihrem Kommentar klingt es so, als würden Sie die Grid.Children-Sammlung verwalten, also fügen Sie sie dort hinzu. –
Idealerweise würden Sie ein ItemsControl (oder möglicherweise eine benutzerdefinierte untergeordnete Klasse daraus nehmen, nicht sicher, ohne Ihr Problem besser zu verstehen), und Sie würden die WorkItems als untergeordnete Elemente des ItemsControl festlegen. Sie würden dann ItemsPanelTemplate verwenden, um die Elemente anzuzeigen ein Gitter. Sie würden eine DataTemplate verwenden, um die tatsächlichen Visuals für die Arbeitselemente zu generieren. DataBinding für das Elementvorlagensteuerelement, das Containersteuerelement (das von ItemsControl generiert wird) und das Raster ermöglichen das Zeichnen von Elementen an den richtigen Stellen. –