我有两个ComboBoxes
<ComboBox Name="cmbMake" DisplayMemberPath="MakeName" SelectedValuePath="MakeID"/>
<ComboBox Name="cmbModel" DisplayMemberPath="ModelName"/>
我使用LINQ-to-Entities填充 cmbGroup ComboBox
Dim db as myDataEntity
cmbGroup.ItemsSource = db.Makes
如何使用XAML根据第一个ComboBox( cmbMake )的选择填充我的第二个ComboBox( cmbModels ),以便我在第一个ComboBox中自动选择过滤第二个ComboBox中的ItemsSource?
这甚至可能吗?
答案 0 :(得分:5)
我在这里发布完整的解决方案
<ComboBox Name="cmbMake" DisplayMemberPath="MakeName" SelectedValuePath="MakeID" Width="200"/>
<ComboBox Name="cmbModel" DisplayMemberPath="ModelName" DataContext="{Binding SelectedItem, ElementName=cmbMake}" Width="200"/>
Private Sub cmbMake_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles cmbMake.SelectionChanged
Dim myItem = From m In myModel
Where m.MakeID = cmbMake.SelectedValue
cmbModel.ItemsSource = myItem
End Sub
每当在cmbModel ComboBox中更改值时,它将使用LINQ重置cmbModel ComboBox的 ItemsSource 。
答案 1 :(得分:4)
如果您的数据是分层的,db.Makes中的每个项目都包含模型列表(并且假设此列表位于名为MyModelsList的属性中),那么:
<ComboBox Name="cmbMake" DisplayMemberPath="MakeName" SelectedValuePath="MakeID"/>
<ComboBox Name="cmbModel" DisplayMemberPath="ModelName" DataContext="{Binding SelectedItem, ElementName=cmbMake}" ItemsSource="{Binding MyModelsList}"/>
答案 2 :(得分:3)
应该可以使用转换器来过滤项目,因为您可以使用MultiBinding
来获取项目的值和其他框中的选项。
看起来像这样:
<ComboBox Name="cmbModel" DisplayMemberPath="ModelName">
<ComboBox.ItemsSource>
<MutliBinding>
<MultiBinding.Converter>
<vc:MyFilterConverter/>
</MultiBinding.Converter>
<Binding Path="Items"/> <!-- This should bind to your complete items-list -->
<Binding Path="SelectedValue" ElementName="cmbMake"/>
</MutliBinding>
</ComboBox.ItemsSource>
</ComboBox>
转换器需要实现IMultiValueConverter
。