Question

J'ai un DataGrid que deux de ses colonnes sont des comboboxes (une contient peu mais pas ceci est le problème).

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

Comment dois-je le faire, je n'utilise pas MVVM, juste simple WPF. Je ne sais pas ce qui devrait être la bonne façon de la mettre en œuvre, j'espère que je l'ai bien commencé.

Je pense que si je pouvais obtenir l'autre ComboBox (qui est situé dans un différez de DataGridCell) à partir de la première sélectionchangehandler, ce serait le meilleur, car je peux alors réinitialiser sa source sur 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 d'accéder au frère DataGridCell droit, puis d'obtenir son enfant (deuxième) combo.

Notez également que la catégorie sélectionnée devrait varier d'une ligne à la ligne et la deuxième combinaison doit dépendre de la catégorie de cette ligne.
J'ai effectivement essayé de le mettre en œuvre afin que la collectionviewsource.Source soit liée à l'élément actuel (c'est-à-dire le DataContext de la ligne), mais cela ne semble pas fonctionner.
Je préfère définir la seconde collectionViewsource (VendrorsCollection) à travers une gâchette ou un gestionnaire d'action sur le 1er sélection de sélection de ComboBox.

Les autres comboBoxes dans ce domaine ne semblent pas faire un 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 ce sont des frères et sœurs simples, pas comme le premier qui est un cousin distant situé profonde dans un autre DataGridCell.

Voici qu'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>

Était-ce utile?

La solution

Je viens de rencontrer tes questions.Avez-vous eu votre problème résolu?Je pense que votre question est similaire à Celui-ci ia obtenu.J'espère que la solution vous aide aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top