2011-08-12 10 views
10

Estoy creando una aplicación en la que se debe interceptar y traducir una lista de objetos antes de mostrarla en un grupo de controles. Con este fin, he creado una DependencyProperty de tipo ObservableCollection (BackupEntry es una clase personalizada que define información sobre una base de datos). Lo que quiero que suceda es que el control estará ligado a una ObservableCollection en un MVVM. Esta colección podría usarse para cargar inicialmente el control. Luego, cuando se agrega una entrada a través de la interfaz de control, debe agregarse a la ObservableCollection interna que se define como DependencyProperty y aparecer en la colección en MVVM, ya que están vinculados. Aquí está el código que estoy usando:ObservableCollection como DependencyProperty

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(); 
} 

Y en la aplicación de prueba:

<my:ExplorerWindow Name="ew" HorizontalAlignment="Left" VerticalAlignment="Top" Width="503" Height="223" BackupItems="{Binding BackupListItems}" /> 

he creado un botón en la pantalla en mi aplicación de prueba. Cuando se hace clic, se agrega un elemento a BackupListItems. BackupItems_CollectionChanged nunca se llama y el nuevo elemento no se muestra en mi colección bajo mi control. ¿Estoy completamente fuera de pista aquí? ¿Qué debo hacer para que esto funcione?

+0

Es el código por encima de su modelo de vista? Si es así, ¿por qué usa objetos Dependency en lugar de Properties –

+0

? No, el código anterior es código subyacente para mi control. No hay una correlación directa entre los datos que se ingresan en la lista y los controles que se usan para mostrarlos. DependencyObject está destinado a exponer la lista para que pueda ser enlazada y los datos pasados ​​ay desde el control. –

Respuesta

9

Debe seguir el patrón dado en this question. Debe suscribirse al evento CollectionChanged dentro del controlador PropertyChanged como se muestra en el enlace anterior.

+0

Eso funcionó perfectamente. Gracias por la rápida respuesta. –

-1

El evento de cambio de colección solo está suscrito para el valor predeterminado de los Elementos de copia de seguridad que configura en el constructor ExplorerWindow. A continuación, reemplaza el valor predeterminado con la colección en su modelo de vista, al cual no se ha suscrito. Debe suscribirse a collectionchanged cada vez que se establece la propiedad. Puede usar la sobrecarga de DependencyProperty.Register que acepta un PropertyMetadata y proporcionar una devolución de llamada para cuando cambie la propiedad. Aquí hay un boceto: no lo compiló, pero debe apuntarlo en la dirección correcta.

public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register(
    "BackupItems", 
    typeof(ObservableCollection<BackupEntry>), 
    typeof(ExplorerWindow), 
    OnBackupItemsChanged); 

private void OnBackupItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var old = (ObservableCollection<BackupEntry>)e.OldValue; 
    if (old != null) 
    { 
     old.CollectionChanged -= BackupItems_CollectionChanged; 
    } 
    ((ObservableCollection<BackupEntry>)e.NewValue).CollectionChanged += BackupItems_CollectionChanged; 
} 

void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 
+0

No funciona. La 'DependencyProperty' es estática, pero' OnBackupItemsChanged' no lo es. –

Cuestiones relacionadas