Доступ к управлению между DataGridCells, динамическое каскадное комбинирование
У меня есть DataGrid, что два из его столбцов являются ComboBox (один содержит несколько, но не в этом проблема).
Я хочу, чтобы, когда пользователь изменяет первое значение Combo, ComboBox в другом столбце должен связываться со свойством его (это свойство является коллекцией). Скажем, первый ComboBox - это Category, я хочу, чтобы, когда пользователь изменял свое значение, другой CB заполнялся значениями (выбранная категория первого комбо).Vendors.
Как мне это сделать, я не использую MVVM, просто простой WPF. Я не знаю, каким должен быть правильный способ его реализации, надеюсь, я все начал правильно.
Я думаю, если бы я мог получить другой ComboBox (который находится в другом DataGridCell) из первого SelectionChangeHandler первого, который был бы лучшим, потому что тогда я могу сбросить его источник при каждом изменении выбора первого. Обратите внимание, что у меня есть возможность достичь текущего (первого) DataGridCell, я просто ищу эффективный способ доступа к правильному брату DataGridCell, а затем получить его дочерний (второй) комбо.
Также обратите внимание, что выбранная категория должна варьироваться от строки к строке, а второй ComboBox должен зависеть от категории этой строки.
Я на самом деле пытался реализовать его так, чтобы CollectionViewSource.Source был привязан к текущему элементу (то есть к DataContext строки), но, похоже, он не работает.
Я предпочитаю устанавливать коллекцию CollectionViewSource (VendorsCollection) второго комбо через триггер Action или обработчик в SelectionChange 1-го ComboBox.
Другие ComboBox в этом поле, похоже, не создают проблем, поскольку все они связаны друг с другом, я мог бы использовать CollectionViewSource.Filter, в любом случае, к ним нет проблем, так как они простые братья и сестры, а не как первый который является дальним родственником, расположенным глубоко в другом DataGridCell.
Вот что я попробовал до сих пор:
<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>
1 ответ
Я только что натолкнулся на ваши вопросы. Вы решили свою проблему? Я думаю, что ваш вопрос похож на тот, который я получил. Надеюсь, что решение там вам тоже поможет.