向EF 4.1添加记录不会反映在列表框中

时间:2013-04-04 16:05:13

标签: c# wpf entity-framework

我有一个数据绑定列表框,它首先使用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的更新值?

2 个答案:

答案 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" };