Pregunta

Me une una colección ObservableCollection<Foo> a una propiedad de dependencia en mi controlador, pero ejecutarlo a través de un IValueConverter para que sea ObservableCollection<object> lugar, que es lo que mi controlador. La conversión funciona bien - creo una ObservableCollection<object> y llenarlo con todos los Foo de la lista original. Sin embargo, esto trae un problema y es que ahora estoy observando en la colección creada en el convertidor de valores, y por lo tanto no ver ninguno de los cambios a la colección original.

Por lo tanto; Qué tengo que conectar manejadores de sucesos en el convertidor de mantener manualmente la colección convertida en sincronía con el original, o hay una mejor manera de manejar esto? Creo que no puedo hacer la conversión sin tener que crear una nueva colección? O puedo hacer yo la unión de alguna forma inteligente de tal manera que no tengo que hacer el convertido?

¿Fue útil?

Solución

No sé si ayuda, pero a menudo en un modelo de vista, declaro IList u otra interfaz de menos específico como el tipo de propiedad en lugar de una específica.

Entonces puedo obligar cuasi todas las colecciones y listas para este hotel fenomenal.

Mientras que la propiedad se establece, puedo comprobar si implementa INotifyPropertyChanged y si sí, adjunte una CollectionChanged-manejador de sucesos. Cuando la propiedad ha cambiado recientemente, me quito el manejador de sucesos de la antigua INotifyPropertyChanged (si fuera).

El inconveniente de esto es, que el modelo de vista debe estar preparado para ver objetos otros tipos de lo esperado. Pero esto es normalmente un trabajo sencillo.

void YourDPValueChanged(DependencyPropertyChangedEventArgs e) {
    INotifyCollectionChanged newCollection = e.NewValue as INotifyCollectionChanged;
    INotifyCollectionChanged oldCollection = e.OldValue as INotifyCollectionChanged;
    if (null != newCollection) {
        newCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
    }
    if (null != oldCollection) {
        oldCollection.CollectionChanged -= new NotifyCollectionChangedEventHandler(Collection_CollectionChanged);
    }

Otros consejos

Si he entendido bien va a enlazar algún tipo de ICollection que no implementa INotifyCollectionChanged través de un convertidor que crea un nuevo ObservableCollection. En ese caso no se obtendría ningún beneficio de la colección ahora desconectado. ¿Es posible vincular a su colección de forma directa (sin convertir) y la implementación de INotifyPropertyChanged y / o INotifyCollectionChanged directamente en el objeto?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top