Domanda

Ho un DataGrid che due delle sue colonne sono ComboBoxes (una contiene pochi ma non questo è il problema).

Voglio, che quando l'utente cambia il primo valore della combo, il ComboBox nell'altra colonna dovrebbe legarsi a una proprietà del suo (questa proprietà è una raccolta). Dì che il primo ComboBox è la categoria, voglio che quando l'utente cambia il suo valore, l'altro CB è popolato con i valori di (categoria selezionata della prima combinata).

Come dovrei farlo, non uso MVVM, solo WPF semplice. Non so quale dovrebbe essere il modo giusto per implementarlo, spero di averlo iniziato bene.

Penso che, se potessi ottenere l'altro ComboBox (che si trova in un datacorcell diverso) dal primo SelectionChangeHandler che sarebbe il migliore, perché allora posso resettare la sua fonte su ogni cambio di selezione del primo. Nota che ho la capacità di raggiungere il DataGridell corrente (i primi), sto solo cercando un modo efficiente per accedere al fratello di DataGridcell giusto e quindi ottenere il suo figlio (secondo) combo.

Si noti inoltre che la categoria selezionata dovrebbe variare da riga alla riga e il secondo ComboBox dovrebbe dipendere dalla categoria di questa riga.
In realtà ho provato ad implementarlo in modo che la raccoltaviewsource.source sia legata all'articolo corrente (cioè il datacontext di fila) ma non sembra funzionare.
Preferisco impostare la seconda collezione di Combo ViewSource (VendiRorsCollection) attraverso un trigger o un gestore d'azione al 1 ° SelectionChange di ComboBox.

Gli altri combotti in quel campo non sembrano creare un problema poiché sono tutti legati l'uno all'altro, potrei usare la raccoltaViewsource.Filter, comunque non è un problema per accedervi come sono semplici fratelli, non come Il primo che è un cugino distante situato in profondità in un altro datagridell.

Ecco cosa è quello che ho provato finora:

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

È stato utile?

Soluzione

Ho appena trovato le tue domande.Hai risolto il tuo problema?Penso che la tua domanda sia simile a questo avuto.Spero che la soluzione ti aiuti anche tu.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top