ComboBox的MVVM SelectedValue返回Null

时间:2016-04-17 18:14:28

标签: c# wpf mvvm combobox selectedvalue

我有问题。我有一个string品牌,string型号的汽车类,... 我还有一个包含ComboBox数据的视图。当我从ComboBox“carBrand”或ComboBox“carModel”中选择一个项目并单击按钮时,我想创建一个新的汽车对象。但是,点击该按钮后,carBrand.SelectedValue.ToString()正在提供Null值,与carModel相同,但我从ComboBox中选择了一个项目。

在我的 VMClass:

Add a1 = new Add();
c_car m1 = param as c_car; 
a1.DataContext = m1;
a1.ShowDialog();

if (a1.DialogResult.HasValue && a1.DialogResult.Value)
{ 
    m1.c_brand = a1.carBrand.SelectedValue.ToString();   //causes NullReferenceException
    m1.c_model = a1.carModel.SelectedValue.ToString();   //causes NullReferenceException 
    m1.c_year = a1.carYear.Content.ToString(); //this works perfectly
    m1.c_km = Int32.Parse(a1.carKm.Content.ToString()); //this also works properly
    //...
}

现在我的查看班级
                                 

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

<!--CarYear EditableLabel-->
<Label x:Name="carYear" Content="{Binding ElementName=carModel, Path=SelectedValue.c_year}" Margin="20,14,17,14" 
       Style="{StaticResource EditableLabelStyle}" Foreground="White"
       Grid.Column="1" Grid.Row="5"  VerticalAlignment="Center" Height="30">
</Label>

<!--CarKM EditableLabel-->
    <Label x:Name="carKm"
       Content="{Binding ElementName=carModel, Path=SelectedItem.c_km}" Style="{StaticResource EditableLabelStyle}"
       Margin="20,14,17,14" 
       Grid.Column="1" Grid.Row="3" Foreground="White" VerticalAlignment="Center" Height="30">
</Label> 

我希望有人可以帮我解决这个问题。

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以简单的答案(我想,我还没有测试过)就是SelectedValuePath上没有设置ComboBox(正如vesan在评论中所述) 。 这意味着SelectedValue始终为null

您可以使用SelectedItem返回选定的Car,然后从中获取该属性,或者只在SelectedValuePath上设置ComboBox

现在,使用绑定当然可以做得更好但是,无论你是否想实现它,都取决于你。