Доступ к контролю между DataGridCells, динамические каскадные комбинации Comboboxes

StackOverflow https://stackoverflow.com/questions/3203416

Вопрос

У меня есть dataGrid, что две его колонны сочетаются (одна немногие, но не так задают).

Я хочу, что, когда пользователь меняет первое значение комбо, Combobox в другом столбке должен связываться с свойством его (это свойство - это коллекция). Скажем, первый Combobox - это категория, я хочу, чтобы, когда пользователь меняет свое значение, другой CB заполнен значениями (первая выбранная категория Combo Combo).

Как мне это сделать, я не использую MVVM, просто простым WPF. Я не знаю, что должно быть правильным способом реализовать его, я надеюсь, что я начал это правильно.

Я думаю, если бы я мог получить другой Combobox (который расположен в другом datagridCell) от первого выбораChangeHangeHandler, который был бы лучшим, потому что тогда я могу сбросить его источник на каждом изменении выбора первого. Обратите внимание, что у меня есть возможность достижения текущего (первого) Datagridcell, я просто ищу эффективный способ доступа к правому брату DataGridCell, а затем получить комбинацию своего ребенка (второй).

Также обратите внимание, что выбранная категория должна варьироваться от строки к строке, а второй Combobox должен зависеть от категории этой строки.
Я на самом деле попытался реализовать его, чтобы набор ссылок. SourceViewsource.source связан с текущим элементом (то есть dataContext row), но это не работает.
Я предпочитаю устанавливать вторую коллекцию Combo Collectionsource (Vendorscollection) через триггер или обработчик действий на 1-й Combobox.

Другие комбинации в этом поле, похоже, не делают проблему, поскольку они все связаны друг с другом, я мог бы использовать CollectionViewsource.Filter, в любом случае, это не проблема для доступа к ним, так как они простые братья и сестры Первый, который является далеким двоюродным братом, расположенный глубоко в другом датаградцелле.

Вот что такое то, что я пробовал до сих пор:

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

Это было полезно?

Решение

Я просто наткнулся на ваши вопросы.Вы получили свою проблему?Я думаю, что ваш вопрос похож на это iполучил.Надеюсь, что решение вам поможет вам тоже.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top