WPF - El filtro CollectionViewSource no funciona

He adquirido un control que permite la selección de varios elementos del artículo del proyecto de código. http://www.codeproject.com/KB/WPF/MultipleSelectionControl.aspx. Básicamente tiene 2 cuadros de lista. Uno comienza con todos los elementos y cuando el usuario selecciona algunos de ellos, se mueven a otro cuadro de lista. Control define dos propiedades de dependencia para las dos listas y la que contiene inicialmente todos los elementos es AvailableItems. Se utiliza en ControlTemplate de control de la siguiente manera:

<ListBox
  Grid.Row="2"
  Grid.Column="0"
  SelectionMode="Extended"
  x:Name="PART_AvailableListBox"
  ItemsSource="{Binding AvailableItems}"
  ItemTemplate="{TemplateBinding ObjectsTemplate}">
  <ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
      <EventSetter Event="MouseDoubleClick" Handler="AvailableListBoxItem_DoubleClick" />
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

Utilizo el control en mi proyecto como:

<Window.Resources>
  <CollectionViewSource x:Key="multiSelectDataView" Source="{Binding ElementName=DocumentRoot, Path=AllItems}" Filter="Data_Filter" />
</Window.Resources>

<UI:MultiSelectControl
  x:Name="multiSelect"
  Style="{StaticResource MultiSelectControlStyle}"
  CurrentTitle="Group Components"
  AvailableTitle="All Components"
  AvailableItems="{Binding Source={StaticResource multiSelectDataView}}"
  CurrentItems="{Binding SelectedItems, Mode=TwoWay}">
    <UI:MultiSelectControl.ObjectsTemplate>
      <DataTemplate>
        <TextBlock Text="{Binding}" />
      </DataTemplate>
    </UI:MultiSelectControl.ObjectsTemplate>
</UI:MultiSelectControl>

Estoy tratando de filtrar AvailableItems vinculándolo a CollectionViewSource y definiendo una función de filtro llamada Data_Filter. AllItems es un objeto List y contiene cadenas. Cuando se inicializa el control, se llama a Data_Filter para cada elemento en AllItems y la propiedad aceptada de FilterEventArgs se establece correctamente para cada elemento. Sin embargo, el control muestra todos los elementos sin tener en cuenta el Data_Filter. En la implementación del control, un objeto ICollectionView se define como:

this.AvailableItemsCollectionView = 
                CollectionViewSource.GetDefaultView(this.AvailableItems);

lo que me hace sospechar que el control está saltando mi vista. Puedo intentar implementar el filtrado en la implementación del control, pero esta no es una buena solución. ¿Alguna sugerencia?

preguntado el 28 de agosto de 11 a las 01:08

1 Respuestas

Si leo sus fragmentos de código correctamente, sí, la vista de su colección nunca se utiliza; GetDefaultView no devuelve ninguna vista que haya sido creada explícitamente por CollectionViewSource.

Parece que el control necesita ser refactorizado para ofrecer una AvailableItemsSource propiedad que le permitiría especificar una vista de colección filtrada. La lógica interna debería utilizar la fuente de los elementos antes de crear una vista predeterminada.

ACTUALIZACIÓN

Aquí hay algo que puedes probar:

Defina un modelo de vista que exponga la colección de elementos disponibles que se pueden vincular en la vista. El modelo de vista ahora será responsable de filtrar el vista de colección predeterminada. Tendrá que decidir cómo activar el filtrado, es decir, a través de comandos o establecedores de propiedades, etc., pero por el bien de este ejemplo, mostraré la configuración del filtro en el constructor del modelo de vista:

public class MyViewModel
{
  public IList MyAvailableItems {...}

  public MyViewModel()
  {
    var defaultView = CollectionViewSource.GetDefaultView(MyAvailableItems);
    defaultView.Filter = ...
  } 
}

La razón por la que esto debería funcionar es que CollectionViewSource.GetDefaultView(...) siempre devuelve la misma vista. Por lo tanto, si el control siempre solicita la vista predeterminada y su modelo de vista le ha agregado un filtro, debe obtener el efecto deseado sin crear explícitamente una CollectionViewSource en XAML.

Respondido 30 ago 11, 21:08

Lo sé, pero cómo se puede hacer con un cambio mínimo en el código de control. Espero una solución más detallada que solo se puede hacer inspeccionando el código de control en el enlace que proporcioné. - Alp Hancıoğlu

Según el código que publicó, no parece que se pueda hacer sin cambiar el código de control porque el programador original solicita la vista de colección predeterminada sin alternativas. - sellmeadog

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.