ObservableCollection als DependencyProperty
Ich bin erstellen einer app, in der eine Liste von Objekten, die überwacht werden sollen und übersetzt werden, bevor Sie angezeigt wird, auf eine Gruppe von Steuerelementen. Zu diesem Zweck habe ich ein DependencyProperty vom Typ ObservableCollection (BackupEntry wird eine eigene Klasse definieren, Informationen über eine Datenbank). Was ich will, geschehen wird, das Steuerelement gebunden werden, um eine ObservableCollection in eine MVVM. Diese Sammlung könnte verwendet werden, um zunächst das Steuerelement laden. Dann, wenn ein Eintrag über das control-interface, es sollte Hinzugefügt werden, um die interne ObservableCollection, die definiert ist als eine DependencyProperty und zeigen sich in der Auflistung im MVVM, da Sie gebunden sind. Hier ist der code, den ich verwende:
protected ObservableCollection<BackupEntry> _BackupItems = new ObservableCollection<BackupEntry>();
public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register("BackupItems", typeof(ObservableCollection<BackupEntry>), typeof(ExplorerWindow));
public ObservableCollection<BackupEntry> BackupItems
{
get { return (ObservableCollection<BackupEntry>)GetValue(BackupItemsProperty); }
set { SetValue(BackupItemsProperty, value); }
}
public ExplorerWindow()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ExplorerWindow), new FrameworkPropertyMetadata(typeof(ExplorerWindow)));
SetValue(BackupItemsProperty, _BackupItems);
_BackupItems.CollectionChanged += new NotifyCollectionChangedEventHandler(BackupItems_CollectionChanged);
}
void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
throw new NotImplementedException();
}
Und in die test-app:
<my:ExplorerWindow Name="ew" HorizontalAlignment="Left" VerticalAlignment="Top" Width="503" Height="223" BackupItems="{Binding BackupListItems}" />
Erstellte ich eine Taste auf dem Bildschirm in meiner test-app. Wenn darauf geklickt wird, wird ein Element Hinzugefügt BackupListItems. BackupItems_CollectionChanged nie aufgerufen wird und das neue Element wird nicht angezeigt in meiner Sammlung in meiner Kontrolle. Bin ich völlig aus der Bahn hier? Was muss ich tun damit dies funktioniert?
Nein, der obige code ist codebehind für meine Steuerung. Es gibt keine direkte Korrelation zwischen den Daten, die in die Liste aufgenommen und die Kontrollen, die verwendet werden, um es anzuzeigen. Die DependencyObject-gemeint ist zum enttarnen in der Liste, so dass es gebunden werden kann und Daten an und von der Steuerung.
InformationsquelleAutor Dirk Dastardly | 2011-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie dem Muster Folgen, in diese Frage. Sie brauchen, um sich in die
CollectionChanged
Ereignis innerhalb derPropertyChanged
handler wie gezeigt in den obigen link.InformationsquelleAutor Jakub
die collection changed-Ereignis ist nur abonniert, um für den default-Wert von BackupItems, dass Sie in der ExplorerWindow Konstruktor. Dann ersetzen Sie den Standardwert mit der Sammlung in der viewmodel - die Sie nicht abonniert haben. Sie müssen abonnieren collectionchanged-jedes mal, wenn die Eigenschaft gesetzt ist. Sie können die überlastung von DependencyProperty.Registrieren akzeptiert ein PropertyMetadata und liefern einen Rückruf, wenn die Eigenschaft ändert. Hier ist eine grobe Skizze - noch nicht kompiliert, sollte aber zeigen Sie in die richtige Richtung.
DependencyProperty
ist eine statische, aberOnBackupItemsChanged
ist nicht.InformationsquelleAutor saus