我有一个带有“汽车”的列表视图和一个组合框,它显示了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它正在工作,但它是一个自动生成的类,所以我不认为这是好方法。
希望你能帮助我:)。
答案 0 :(得分:0)
如果是答案
这只是一个参考。
foreach (Gas g in tempList) GasList.Add(g);
每辆车都需要新品。
向Gas添加Gas ctor。
foreach (Gas g in tempList) GasList.Add(new Gas(g));