Pergunta

Tenho um DataGrid que duas de suas colunas são ComboBoxes (uma contém poucas mas não é esse o problema).

Quero que quando o usuário alterar o valor do primeiro Combo, o ComboBox da outra coluna se vincule a uma propriedade sua (esta propriedade é uma coleção).Digamos que o Primeiro ComboBox seja Categoria, quero que quando o usuário alterar seu valor, o outro CB seja preenchido com os valores de (categoria selecionada do primeiro combo).Vendores.

Como devo fazer, não uso MVVM, apenas WPF simples.Não sei qual deveria ser a maneira certa de implementá-lo, espero ter começado certo.

Acho que se eu conseguisse pegar o outro ComboBox (que está localizado em um DataGridCell diferente) do SelectionChangeHandler do primeiro seria o melhor, pois assim posso zerar sua fonte a cada mudança de seleção do primeiro.Observe que tenho a capacidade de alcançar o DataGridCell atual (o primeiro), estou apenas procurando uma maneira eficiente de acessar o irmão DataGridCell correto e, em seguida, obter seu combo filho (segundo).

Observe também que a categoria selecionada deve variar de linha para linha, e o segundo ComboBox deve depender da categoria desta linha.
Na verdade, tentei implementá-lo para que CollectionViewSource.Source fosse vinculado ao item atual (ou seja,o DataContext da linha), mas parece não funcionar.
Eu prefiro definir o CollectionViewSource do segundo combo (VendorsCollection) através de um gatilho ou manipulador de ação no SelectionChange do primeiro ComboBox.

Os outros ComboBoxes nesse campo não parecem causar problemas, pois estão todos vinculados entre si, posso usar CollectionViewSource.Filter, de qualquer forma, não há problema em acessá-los, pois são irmãos simples, não como o primeiro. que é um primo distante localizado no fundo de outro DataGridCell.

Aqui está o que eu tentei até agora:

<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>
Foi útil?

Solução

Acabei de me deparar com suas perguntas.Você conseguiu resolver seu problema?Acho que sua pergunta é semelhante a Este Eu obtive.Espero que a solução ajude você também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top