Combobox selectedValue更改所有项目属性

时间:2013-12-22 15:41:33

标签: c# wpf entity-framework data-binding mvvm

我有一个带有“汽车”的列表视图和一个组合框,它显示了listview的“Gas”:SelectedCar:

<ListView ItemsSource="{Binding CarList}" SelectedItem="{Binding SelectedCar}" />
<ComboBox ItemsSource="{Binding GasList}"
             DisplayMemberPath="Name"
             SelectedValue="{Binding SelectedCar.Gas.ID}"
             SelectedValuePath="ID"/>

我的MainViewModel管理“CarList”和“SelectedCar”属性:

public class MainViewModel : ViewModelBase
{
    public ObservableCollection<Car> CarList { get; set; }

    private Car selectedCar;
    public Car SelectedCar
    {
        get { return selectedCar; }
        set
        {
            if (selectedCar != value)
            {
                selectedCar = value;
                RaisePropertyChanged("SelectedCar");
            }
        }
    }

    public MainViewModel()
    {
        IList<Car> tempList;

        using (var ctx = new CarDBFirstEntities())
        {

            var car = ctx.Cars
                .Include("Gas")
                .ToList();

            tempList = (IList<Car>)car;
        }


        CarList = new ObservableCollection<Car>();

        //Convert LINQ list to ObservableCollection
        foreach (Car c in tempList)
            CarList.Add(v);

    }
}

我的CarViewModel(从我的窗口调用)来自MainViewModel并管理“GasList”属性:

public class CarViewModel : MainViewModel
{
    public ObservableCollection<Gas> GasList { get; set; }

    public CarViewModel()
    {
        IList<Gas> tempList;

        using (var ctx = new CarDBFirstEntities())
        {
            var gas = ctx.Gas.ToList();

            tempList = (IList<Gas>)gas;
        }

        GasList = new ObservableCollection<Gas>();

        //Convert LINQ list to ObservableCollection
        foreach (Gas g in tempList)
            GasList.Add(g);

    }
}

我使用的是EF 6,所以这里是我自动生成的poco代理类:

public partial class Car
{
    ...
    public Nullable<int> GasID { get; set; }
    ...

    public virtual Gas Gas{ get; set; }
}

public partial class Gas
{
    public Gas()
    {
        this.Car = new HashSet<Car>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    ...

    public virtual ICollection<Car> Cars { get; set; }
}

好吧,当我在列表视图中选择一辆汽车时,组合框会显示汽车的汽油名称。 问题是当我改变组合框中的值时,所有具有相同气体的汽车都会更新 这是一个例子:
我有2辆汽车具有相同的汽油值(“汽油”) 我在listView中选择第一个并更改组合框值(例如“柴油”) 然后如果我在listview中选择第二个,那么组合框也会显示“柴油”。

据我所知,我的组合框只是改变气体的ID,而不是SelectedCar.Gas的ID,所以问题来自这里(我猜)。

我尝试了很多东西,例如在我的组合框中用“SelectedItem”替换“SelectedValue”,如果我在我的poco代理气体类中override the equals method它正在工作,但它是一个自动生成的类,所以我不认为这是好方法。

希望你能帮助我:)。

1 个答案:

答案 0 :(得分:0)

如果是答案

这只是一个参考。

foreach (Gas g in tempList) GasList.Add(g); 

每辆车都需要新品。

向Gas添加Gas ctor。

foreach (Gas g in tempList) GasList.Add(new Gas(g));