2010-07-08 3 views
0

J'ai un DataGrid dont deux de ses colonnes sont des ComboBox (l'une contient peu mais pas le problème).Accès au contrôle entre DataGridCells, ComboBoxes en cascade dynamique

Je veux, que lorsque l'utilisateur change la première valeur Combo, le ComboBox dans l'autre colonne doit se lier à une propriété de son (cette propriété est une collection). Dites le premier ComboBox est la catégorie, je veux que lorsque l'utilisateur change sa valeur, l'autre CB est peuplé avec les valeurs de (catégorie sélectionnée du premier combo) .Vendors.

Comment dois-je faire, je n'utilise pas MVVM, juste WPF simple. Je ne sais pas quelle devrait être la bonne façon de l'implémenter, j'espère que j'ai bien commencé.

Je pense, si je pouvais obtenir l'autre ComboBox (qui est situé dans un DataGridCell différent) du premier SelectionChangeHandler qui serait le meilleur, parce que je peux réinitialiser sa source à chaque changement de sélection du premier. Notez que j'ai la capacité d'atteindre le DataGridCell actuel (le premier), je suis juste à la recherche d'un moyen efficace pour accéder au bon frère DataGridCell et ensuite obtenir son combo enfant (deuxième).

Notez également que la catégorie sélectionnée doit varier d'une ligne à l'autre et que la seconde zone de liste déroulante doit dépendre de la catégorie de cette ligne.
J'ai effectivement essayé de l'implémenter pour que CollectionViewSource.Source soit lié à l'élément actuel (c'est-à-dire le DataContext de la ligne) mais cela ne semble pas fonctionner.
Je préfère définir CollectionViewSource (VendorsCollection) du second combo via un déclencheur d'action ou un gestionnaire au niveau du SelectionChange du 1er ComboBox. Les autres ComboBox dans ce champ ne semblent pas poser de problème car ils sont tous liés les uns aux autres, je pourrais utiliser CollectionViewSource.Filter, de toute façon ce n'est pas un problème pour y accéder car ils sont simples frères et sœurs, pas comme le premier qui est un cousin éloigné situé au fond d'une autre DataGridCell.

Voici ce qui est ce que j'ai essayé jusqu'à présent:

<DataGrid> 
    <DataGrid.Resources> 
     <CollectionViewSource x:Key="CategoriesCollection" Source="{Binding Context.CategoriesList, Source={x:Static Application.Current}, IsAsync=True}" /> 
    </DataGrid.Resources> 

    <DataGrid.Columns> 

     <DataGridTemplateColumn Header="Category"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock DataContext="{Binding Category}" Text="{Binding Title}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <!--This is the first ComboBox--> 
        <ComboBox 
           IsSynchronizedWithCurrentItem="False" 
           ItemsSource="{Binding Source={StaticResource CategoriesCollection}}" 
           DisplayMemberPath="Title" 
           SelectionChanged="cbCategories_SelectionChanged" 
           SelectedItem="{Binding Category}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTemplateColumn Header="Style"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock DataContext="{Binding Finish.Style.Vendor}" Text="{Binding Contact.Title}"/> 
         <TextBlock DataContext="{Binding Finish.Style}" Text="{Binding Title}"/> 
         <TextBlock Text="{Binding Finish.Title}"/> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <StackPanel.Resources> 
          <!--I want, that when the user selects a value in the first ComboBox, 
        the VendorsCollection below should be populated with the selected Category.Vendors, 
        or alternatively current row's data item.Category.Vendors, 
        I just donno how to access current row from these resources.--> 
          <CollectionViewSource x:Key="VendorsCollection" Source="{Binding Vendors, Source={StaticResource CategoriesCollection}}" /> 
          <CollectionViewSource x:Key="StylesCollection" Source="{Binding Styles, Source={StaticResource VendorsCollection}}" /> 
          <CollectionViewSource x:Key="FinishesCollection" Source="{Binding Finishes, Source={StaticResource StylesCollection}}" /> 
         </StackPanel.Resources> 
         <ComboBox              
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding Source={StaticResource VendorsCollection}}" 
            SelectedItem="{Binding Finish.Style.Vendor}" 
            DisplayMemberPath="Contact.Title"/> 
         <ComboBox 
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding Source={StaticResource StylesCollection}}" 
            SelectedItem="{Binding Finish.Style}" 
            DisplayMemberPath="Title"/> 
         <ComboBox 
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding Source={StaticResource FinishesCollection}}" 
            SelectedItem="{Binding Finish}" 
            DisplayMemberPath="Title"/> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 

    </DataGrid.Columns> 
</DataGrid> 

Répondre

0

Je viens de tomber sur vos questions. Avez-vous résolu votre problème? Je pense que votre question est similaire à this one j'ai obtenu. J'espère que la solution vous aidera aussi.