2011-08-28 6 views
0

J'ai acquis un contrôle qui permet de sélectionner plusieurs éléments de l'article codeproject http://www.codeproject.com/KB/WPF/MultipleSelectionControl.aspx. Fondamentalement, il a 2 listes de sélection. On commence avec tous les articles et quand l'utilisateur en sélectionne certains, ils passent à une autre liste. Le contrôle définit deux propriétés de dépendance pour les deux listes et celle qui contient initialement tous les éléments est AvailableItems. Il est utilisé dans ControlTemplate de contrôle comme suit:WPF - Le filtre CollectionViewSource ne fonctionne pas

<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> 

J'utilise le contrôle dans mon projet:

<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> 

Je suis en train de filtrer AvailableItems par liaison à un CollectionViewSource et définissant une fonction de filtre appelé Data_Filter. AllItems est un objet List et contient des chaînes. Lorsque le contrôle est initialisé, Data_Filter est appelé pour chaque élément dans AllItems et la propriété acceptée de FilterEventArgs est définie correctement pour chaque élément. Cependant, le contrôle affiche tous les éléments sans tenir compte du Data_Filter. Dans la mise en œuvre de contrôle d'un objet ICollectionView est défini comme:

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

qui me rend suspecte que le contrôle saute mon avis. Je peux essayer d'implémenter le filtrage dans la mise en œuvre du contrôle, mais ce n'est pas une bonne solution. Aucune suggestion?

Répondre

0

Si je lis correctement vos extraits de code, oui, votre vue de collection n'est jamais utilisée; GetDefaultView ne renvoie aucune vue explicitement créée par un objet CollectionViewSource.

Il semble que le contrôle doit être refactorisé pour offrir une propriété AvailableItemsSource qui vous permet de spécifier une vue de collection filtrée. La logique interne doit ensuite utiliser la source des éléments avant de créer une vue par défaut.

MISE À JOUR

Voici quelque chose que vous pouvez essayer:

Définir un modèle de vue qui expose la collection d'éléments disponibles qui peuvent être liés à la vue. Le modèle de vue sera désormais responsable du filtrage de la vue de collection par défaut . Vous devrez décider comment déclencher le filtrage, c'est-à-dire, à travers les commandes, ou les setters de propriétés, etc., mais pour le présent exemple, je montrerai le filtre de configuration dans le constructeur du modèle:

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

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

La raison pour laquelle cela devrait fonctionner est que CollectionViewSource.GetDefaultView(...) renvoie toujours la même vue. Ainsi, si le contrôle demande toujours l'affichage par défaut et que votre modèle d'affichage a ajouté un filtre, vous devriez obtenir l'effet désiré sans créer explicitement un CollectionViewSource en XAML.

+0

Je sais cela, mais comment cela peut-il être fait avec un minimum de changement de code de contrôle. J'attends une solution plus détaillée qui ne peut être faite qu'en inspectant le code de contrôle dans le lien que j'ai donné. –

+0

Basé sur le code que vous avez posté, il ne semble pas que cela puisse être fait sans changer le code de contrôle parce que le programmeur d'origine demande la vue de collection par défaut sans alternatives. – sellmeadog

Questions connexes