He escrito un Control WPF personalizado con extensión de búsqueda, llamémoslo MyControl
. El control es descendiente de una clase ItemsControl
.WPF CollectionViewSource ¿Vistas múltiples?
Así que alimentar a la fuente de los datos para de esta manera:
el propio control utiliza
protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue)
{
if (newValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(newValue);
view.Filter += this.FilterPredicate;
}
if (oldValue != null)
{
ICollectionView view = CollectionViewSource.GetDefaultView(oldValue);
view.Filter -= this.FilterPredicate;
}
base.OnItemsSourceChanged(oldValue, newValue);
}
para filtrar la vista de la colección de origen (que muestra por lo tanto, en un ListBox interior).
Supongamos ahora que tenemos 10 de estos MyControls definidos en XAML con el mismo DynamicSource. El problema es que si uno de ellos aplica el filtro en la colección fuente, también afectará a todas las demás instancias.
¿Cómo cambiaría el control para evitar este comportamiento?
Muy bien, realmente funciona ... ¡Muchas gracias! Solo una pregunta noobie - es .RegisterReadOnly() ¿a qué te refieres con decir 'readonly'? –
Lo estoy preguntando porque en ItemsSourceChanged estoy configurando ItemsSourceView = new CollectionViewSource {Source = newValue} .View, donde ItemsSourceView es un DP, por lo que no puedo simplemente eliminar el setter. –
Sí. Es un poco más que simplemente cambiar la inicialización: privado estático de solo lectura DependencyPropertyKey MyDPPropertyKey = DependencyProperty.RegisterReadOnly (...); public static readonly DependencyProperty MyDPProperty = MyDPPropertyKey.DependencyProperty; objeto público MyDP { \t get {return (object) GetValue (MyDPProperty); } \t private set {SetValue (MyDPPropertyKey, value); } } –