1

我有一个首先使用 EF 4.1 模型构建的数据绑定列表框。所以我所有的课程都是为我建造的。因为我有三个控件来反映从外键回溯的表数据。this.lstBox2.ItemSource = entityContext.TableObject2.ToList() 将返回每条记录。不是 MD 显示的记录受外键约束的限制。

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 错误。如何为控件分配保存到实体上下文的更新值?

4

2 回答 2

1

模型更改不会自动传播到视图模型或您的视图(我可以看到您没有 MVVM 视图模型?)

你通常需要BindPropertyChanged.

这是从设备上写的,非常粗糙和快速(我可能打错了一些东西等)......

<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(尽管有优点和缺点,但不涉及)。

例如看到这个使用 EF Code-First 时是否需要实现 INotifyPropertyChanged?

在这种情况下 - 当只是添加新项目时 - 应该会自动转到您的 ListBox。

如果您刷新集合 - 然后执行上述操作(为集合属性设置 PropertyChanged)

Item Properties are not automatically updated- 除非您也在模型上实现 IPropertyChanged。

于 2013-04-04T16:37:21.757 回答
0

代替:

this.lstBox2.ItemsSource = null;

保存更改以重建列表后,尝试从 entityContext 获取数据:

this.lstBox2.ItemsSource = entityContext.TableObject2.ToList();

我敢肯定,您可以采用更好的方法,但是要快速将数据从数据库中取出并放入列表中,这应该可行。

也是一个快速代码位,您可以使用对象初始化器:

TableObject2 class2 = new TableObject2 { value1 = 0, value2 = "new location" };
于 2013-04-04T16:34:48.930 回答