我有一個DataGrid,它的兩列是ComboBoxes(一個包含少數,但不是這個問題)。訪問DataGridCells,動態級聯ComboBoxes之間的控制
我想,當用戶更改第一個組合框的值時,另一列中的組合框應綁定到其屬性(此屬性是一個集合)。說第一個組合框是類別,我希望當用戶改變它的值時,另一個CB填充(首先組合選擇的類別).Vendors的值。
我應該怎麼做,我不使用MVVM,只是簡單的WPF。 我不知道應該採取什麼正確的方式來實施它,我希望我能夠開始正確的做法。
我想,如果我可以從第一個SelectionChangeHandler獲得最好的另一個ComboBox(它位於不同的DataGridCell中),因爲那樣我可以在第一個選擇更改時重置它的源。 請注意,我有能力達到當前(第一個)DataGridCell,我只是尋找一種有效的方式來訪問正確的DataGridCell兄弟,然後得到它的孩子(第二)組合。
另請注意,所選的類別應因行而異,第二個ComboBox應取決於此行的類別。
我實際上試圖實現它,以便CollectionViewSource.Source綁定到當前項目(即行的DataContext),但它似乎不工作。
我更喜歡在第一個ComboBox的SelectionChange中通過Action觸發器或處理程序設置第二個組合框的CollectionViewSource(VendorsCollection)。
該字段中的其他ComboBoxes似乎沒有問題,因爲它們都是彼此綁定的,我可能會使用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>