MVVM绑定另一个ComboBox

时间:2016-04-10 14:00:42

标签: c# wpf xaml mvvm combobox

我是MVVM的新手,我想问一下,如果你能帮我把ComboBox中的SelectedValue带到我的VM-Class。在我的例子中,我有一个包含所有汽车品牌的ComboBox。如果我选择一个汽车品牌,我想在另一个ComboBox中选择汽车品牌的所有车型。我已经做过一些研究,但我无法找到解决问题的方法。

After clicking on the Brand-ComboBox.

到目前为止这很好,但是当我想显示模型时,ComboBox保持空白。

来自 View-Class 的代码:`

<ObjectDataProvider x:Key="vmcars" ObjectType="{x:Type local:VMCars}"/>

<!--MainGrid-->
<Grid DataContext="{StaticResource vmcars}">
.
.
.
.
</Grid>

来自 Brand-ComboBox 的代码:

        <!--CarBrand Combobox-->
        <ComboBox x:Name="carBrand" Style="{StaticResource combobox}" 
                  ItemsSource="{Binding AllCars}"
                  Grid.Column="1" Grid.Row="1"
                  DisplayMemberPath="c_brand"
                  Margin="20,13,17,15" 
                  VerticalAlignment="Center" Height="30">
            <ComboBox.SelectedItem>
                <Binding Path="SelectedBrand"                  
                         BindsDirectlyToSource="True"                  
                         Mode="OneWayToSource" />
            </ComboBox.SelectedItem>
        </ComboBox>

来自 Model-ComboBox 的代码:

        <!--CarModel ComboBox-->
        <ComboBox x:Name="carModel" Style="{StaticResource combobox}" Grid.Column="1"
                  Margin="20,15,17,14"
                  ItemsSource="{Binding ModelSelectedBrand}" DisplayMemberPath="c_model"
                  Grid.Row="2" VerticalAlignment="Center" Height="30">
        </ComboBox>

来自 VMClass 的代码:

    public string selectedBrand;
    public string SelectedBrand
    {
        get { return selectedBrand; }
        set
        {
            selectedBrand = value;
            PropertyChanged(this, new PropertyChangedEventArgs
                               ("ModelSelectedBrand"));

        }
    }

        public IEnumerable<c_car> ModelSelectedBrand             
    {
        get
        {
            return (from c in db.c_car
                    where c.c_brand.Equals(SelectedBrand) //THIS IS CAUSING PROBLEMS

                    select c).GroupBy(x=>x.c_model).Select(x=>x.FirstOrDefault()).OrderBy(x=>x.c_model).ToList();  
        }
    }

当我在Linq语句中注释 WHERE 子句时,我得到了这个结果: click here

这些全部汽车型号。

我认为问题在于我的&#34; SelectedBrand &#34;物业不会从 carBrand-ComboBox

获得任何价值

因此,我想问你,是否有人知道可能导致麻烦的原因。

1 个答案:

答案 0 :(得分:2)

您的汽车品牌ComboBox目前正在将c.car的班级名称传递给您的查询。如果您绑定到SelectedValue而不是SelectedItem,并将SelectedValuePath设置为"c_car"则可以正常工作。

所以你的新CarBrand ComboBox定义将是

<!--CarBrand Combobox-->
<ComboBox x:Name="carBrand" Style="{StaticResource combobox}" 
          ItemsSource="{Binding AllCars}"
          Grid.Column="1" Grid.Row="1"
          DisplayMemberPath="c_brand"
          SelectedValuePath="c_brand"
          Margin="20,13,17,15" 
          VerticalAlignment="Center" Height="30">
    <ComboBox.SelectedValue>
        <Binding Path="SelectedBrand"                  
                 BindsDirectlyToSource="True"                  
                 Mode="OneWayToSource" />
    </ComboBox.SelectedValue>
</ComboBox>