2009-10-30 3 views
1

J'ai cette situation où je veux afficher une liste d'objets d'administration et une zone de liste déroulante pour chaque administration. Dans cette zone de liste déroulante, je veux une liste avec les employés appartenant à cette administration, avec une option vide. J'ai donc besoin de filtrer en fonction de l'administration.Filtrage dynamique avec une zone de liste déroulante ItemsControl

Jusqu'à présent, je suis venu avec le code suivant (note: les noms d'objets ont été traduits)

<ItemsControl x:Name="listAdministrations" ItemsSource="{Binding Path=AllAdministrations}" Margin="0,0,0,6"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical" > 
       <TextBox Content="{Binding Path=AdministrationName}" /> 

       <StackPanel Orientation="Horizontal" Margin="14,0,0,0"> 
        <Label>Declares under:</Label> 
        <ComboBox DisplayMemberPath="DisplayFullName"> 
         <ComboBox.ItemsSource> 
          <CompositeCollection> 
           <!-- empty option --> 
           <model:Employee DisplayFullName="-" /> 
           <CollectionContainer Collection="{Binding Source={StaticResource employeeCV}}"/> 
          </CompositeCollection> 
         </ComboBox.ItemsSource> 
        </ComboBox> 
       </StackPanel> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Le employeeCV de ressource statique est un CollectionViewSource avec un événement de filtre ci-joint. Mais je dois en quelque sorte passer l'administration actuelle dans la boucle ItemsControl à cet événement. Dans la liaison de données, cela se traduit par {Binding Path =.} Dans ItemsControl. L'objet expéditeur est mon CollectionViewSource mais cela ne fournit aucune donnée utile.

Quelque chose comme ceci:

private void EmployeeAdministrationFilter(object sender, FilterEventArgs e) 
    { 
     Employee employee = (Employee)e.Item; 
     Administration administration; // how do I pass the administration to this filter? 
} 

Répondre

0

Je ne sais pas comment faire exactement ce que vous demandez, mais je peux proposer une autre approche: créer une méthode d'extension pour votre classe d'administration. Cette méthode crée une vue de collection filtrée et la renvoie. Vous pouvez ensuite lier au résultat de la méthode.

+0

Antonmarkov, voulez-vous dire quelque chose comme ceci: (pseudo-code) public class administration { publique CollectionViewSource CollectionViewSource { get; jeu privé; Administration publique() { CollectionViewSource = new CollectionViewSource(); CollectionViewSource.Filter + = EmployeeAdministrationFilter; } EmployeeAdministrationFilter private void (object sender, FilterEventArgs e) { // stuff filtre // this = administration } } – Frederik

+0

Oui, si vous pouvez modifier l'administration, vous pouvez simplement ajouter la propriété directement. Vous devriez probablement utiliser un simple CollectionView au lieu de CollectionViewSource. CollectionViewSource est une extension de balisage à utiliser dans XAML. – Anton

Questions connexes