使用XAML基于另一个ComboBox填充ComboBox

时间:2011-07-29 14:06:12

标签: wpf vb.net xaml data-binding linq-to-entities

我有两个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?

这甚至可能吗?

3 个答案:

答案 0 :(得分:5)

我在这里发布完整的解决方案

XAML

<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

非常感谢@XAMeLi的帮助!

答案 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