Заполните ComboBox на основе другого ComboBox, используя XAML - PullRequest
2 голосов
/ 29 июля 2011

У меня есть два ComboBox

<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

Как мне заполнить мой второй ComboBox ( cmbModels ), основываясь на выборе первого ComboBox ( cmbMake ), используя XAML, чтобы все, что я выбираю в первом ComboBox, автоматически фильтровало ItemsSource во втором ComboBox?

Это вообще возможно?

Ответы [ 3 ]

5 голосов
/ 04 августа 2011

Я выкладываю полное решение здесь

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

Всякий раз, когда значение изменяется в ComboBox cmbModel, оно использует LINQ для сброса ItemsSource ComboBox cmbModel.

Большое спасибо @XAMeLi за помощь!

4 голосов
/ 30 июля 2011

Если ваши данные являются иерархическими, где каждый элемент в db.Makes содержит список моделей (и допустим, что этот список находится в свойстве с именем MyModelsList), то:

<ComboBox Name="cmbMake" DisplayMemberPath="MakeName" SelectedValuePath="MakeID"/>
<ComboBox Name="cmbModel" DisplayMemberPath="ModelName" DataContext="{Binding SelectedItem, ElementName=cmbMake}" ItemsSource="{Binding MyModelsList}"/>
3 голосов
/ 29 июля 2011

Должна быть возможность использовать конвертер для фильтрации элементов, для этого вы можете использовать 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.

...