Zugriff auf die Steuerung zwischen DataGridCells, dynamisch kaskadierende ComboBoxes

Ich habe ein DataGrid, dessen zwei Spalten ComboBoxes sind (eine enthält nur wenige, aber das ist nicht das Problem).

Ich möchte, dass, wenn der Benutzer den Wert der ersten Combo ändert, die ComboBox in der anderen Spalte an eine ihrer Eigenschaften gebunden wird (diese Eigenschaft ist eine Auflistung). Angenommen, die erste ComboBox ist Kategorie. Wenn der Benutzer ihren Wert ändert, wird die andere CB mit den Werten von (der ausgewählten Kategorie der ersten ComboBox) .Vendors gefüllt.

Wie soll ich das machen, ich benutze kein MVVM, nur einfaches WPF. Ich weiß nicht, wie ich es richtig umsetzen soll. Ich hoffe, ich habe es richtig angefangen.

Ich denke, wenn ich die andere ComboBox (die sich in einer anderen DataGridCell befindet) aus dem SelectionChangeHandler des Ersten holen könnte, wäre das die beste, denn dann kann ich die Quelle bei jeder Auswahländerung des Ersten zurücksetzen. Beachten Sie, dass ich in der Lage bin, die aktuelle (die erste) DataGridCell zu erreichen. Ich suche nur nach einem effizienten Weg, um auf das richtige DataGridCell-Geschwister zuzugreifen und dann die untergeordnete (zweite) Combo zu erhalten.

Beachten Sie auch, dass die ausgewählte Kategorie von Zeile zu Zeile variieren sollte und die zweite ComboBox von der Kategorie dieser Zeile abhängen sollte.
Ich habe tatsächlich versucht, es so zu implementieren, dass die CollectionViewSource.Source an das aktuelle Element (d. H. Den DataContext der Zeile) gebunden ist, aber es scheint nicht zu funktionieren.
Ich bevorzuge es, die CollectionViewSource (VendorsCollection) der zweiten Kombination über einen Action-Trigger oder -Handler beim SelectionChange der 1st ComboBox festzulegen.

Die anderen ComboBoxen in diesem Feld scheinen kein Problem zu bereiten, da sie alle aneinander gebunden sind. Vielleicht verwende ich CollectionViewSource.Filter. Es ist jedoch kein Problem, auf sie zuzugreifen, da sie einfache Geschwister sind, nicht wie die ersten eine, die eine entfernte Cousine ist, die sich tief in einer anderen DataGridCell befindet.

Hier ist was ist was ich bisher ausprobiert habe:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage