【发布时间】:2013-12-22 15:41:33
【问题描述】:
我有一个带有“汽车”的列表视图和一个显示列表视图 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 中选择第一个并更改组合框的值(例如,更改为“diesel”)。
然后,如果我在列表视图中选择第二个,组合框也会显示“柴油”。
据我所知,我的组合框只是更改了 Gas 的 ID,而不是 SelectedCar.Gas 的 ID,所以问题来自这里(我猜)。
我尝试了很多事情,比如在我的组合框中用“SelectedItem”替换“SelectedValue”,如果我在我的 poco 代理 Gas 类中 override the equals method 它可以工作,但它是一个自动生成的类,所以我认为这不是好方法.
希望你能帮助我:)
【问题讨论】:
-
这只是一个参考。 foreach (tempList 中的气体 g) GasList.Add(g);每辆车都需要新车。
-
感谢您的回答,但我不明白您的意思?
-
向 Gas 添加一个 Gas ctor。 foreach (tempList 中的 Gas g) GasList.Add(new Gas(g));
-
我试过了,但没有任何改变
-
好的,就是这样:) thx
标签: c# wpf entity-framework data-binding mvvm