我有一个数据绑定列表框,它首先使用EF 4.1模型构建。所以我所有的课程都是为我而建的。因为我有三个控件反映从外键追溯的表数据。 this.lstBox2.ItemSource = entityContext.TableObject2.ToList()将返回每条记录。不是M-D显示受外键约束限制的记录。
TableObject2 class2 = new TableObject2();
class2.value1 = 0;
class2.value2 = "new location";
using (TKOEntities entityContext = new TKOEntities())
{
entityContext.TableObject2.AddObject(class2);
entityContext.SaveChanges();
this.lstBox2.ItemsSource = null;
}
SaveChanges会将数据更新到数据库中。但是控件没有刷新(this.lstBox2.Refresh()不起作用)。如果我尝试将值设置为控件。我也得到了我们的ItemControl.ItemSource错误。如何为控件分配保存到entitycontext的更新值?
答案 0 :(得分:1)
模型更改不会自动传播到视图模型或视图(因为我可以看到您没有MVVM视图模型?)
您通常需要Bind
并执行PropertyChanged
。
这是从设备写的,非常粗糙和快速(我可能输错了等等。)...
<ListBox ItemsSource={Binding YourCollectionProperty} >
在您的“视图模型”中(或者,如果这是您的“控件”,我不推荐,那么请执行{Binding ElementName=_mywin, Path=YourCollectionProperty}
之类的操作)将属性定义为...
public ObservableCollection<POCOItem> YourCollectionProperty
{
get
{
return _collection ?? (_collection = WrapModel());
}
set
{}}
实施IPropertyChanged interface
当您的模型更新时......
_collection = null;
OnPropertyChanged("YourCollectionProperty");
ObservableCollection
在这里没用(数组/列表也会一样 - 保持模型集合同步并不容易。
因此,如果您需要与模型紧密相关 - 您可以将模型导航属性ICollection
设为ObservableCollection
(虽然有利有弊但不能进入) 。
e.g。看到这个Do I need to implement INotifyPropertyChanged when using EF Code-First?
在这种情况下 - 当只是添加新项目时 - 应该自动转到ListBox。
如果刷新集合 - 则执行上述操作(为集合属性设置PropertyChanged)
Item Properties are not automatically updated
- 除非您在模型上实施IPropertyChanged。
答案 1 :(得分:0)
而不是:
this.lstBox2.ItemsSource = null;
在保存更改以重建列表后,尝试从entityContext获取数据:
this.lstBox2.ItemsSource = entityContext.TableObject2.ToList();
你可以采取一种更好的方法,但是为了快速将你的数据包从数据库中删除并进入列表,这应该可行。
也是一个快速的代码位,你可以使用对象初始化器:
TableObject2 class2 = new TableObject2 { value1 = 0, value2 = "new location" };