2013-01-07 17 views
0

我有一个静态变量从数据库中检索组列表。插入数据库后将组合框重新绑定到静态ObservableCollection

public static ObservableCollection<Group> GroupList 
{ 
get 
{ 
    return Group.getGroups(); //<-- this retrieve group from database 
} 
} 

然后我将我的组合框绑定到我的xaml上的静态属性。

<ComboBox Name="cmbGroup" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Source={x:Static wpf:Group.GroupList}}" DisplayMemberPath="Name" SelectedValuePath="Id" SelectionChanged="cmbGroup_SelectionChanged" /> 

直到这一点,一切工作正常。然后,我将新组输入到文本框中,并向数据库中插入1行。成功插入数据库后,我的组合框没有改变。我想要的是我的组合框即刻更新。
据我了解,我需要更新静态GroupList的属性,所以我绑定到组合框再次工作。任何想法如何实现这一目标?

作为一个方面说明,我使用这种方法,所以我只需要编写1次从数据库检索组列表,并删除在后面的代码上写很多行的必要性。通过这种方法,我只需要ItemsSource =“{Binding Source = {x:Static wpf:Group.GroupList}}”与组合框绑定。

+0

当您将新组添加到“文本框”中时,是将其添加到组合框绑定的集合还是将其添加到“你只用数值更新数据库吗?我没有足够的WPF工作,因为绑定可能会比winforms略有不同,但如果你只是在数据库中插入新的值而不更新本地的ObservableCollection,那么你不需要重新加载/刷新集合的值从数据库为了让它认识到有一个新的价值? –

+0

这正是问题所在。组合框绑定的集合不是手动添加的,我不使用代码来调用方法。一切都是通过xaml完成的。据说,我没有添加项目集合后,我插入新的数据到数据库,我不想。我只是想让WPF重新评估Group.GroupList的bindingsource属性。 – vugtis

+0

您的本地ObservableCollection将不会意识到数据库的任何更改,因为上下文只知道附加到它并正在跟踪的实体发生的任何更改。如果您在上下文之外更新数据库,则它不会看到该数据库,并且不会显示新记录,因为它只显示您的本地集合。您需要重新查询数据库或将其添加到本地集合中。你不能手动将它添加到本地集合,然后调用SaveChanges()?然后上下文会自动将它添加到数据库中。 –

回答

0

不客气。

如果您使用的是实体框架,更新本地对象并让DbContext/ObjectContext处理您的更改跟踪会更简单。然后,不需要记住有人想要重新查询数据库。然后团队成员可以只关心对象,而不必担心所有事物都是同步的。如果在表单可用时对象上下文寿命持续存在,那么您可以设置一个定时器以设定的间隔运行,调用SaveChanges并使用数据库中的最新数据重新实例化DbContext。由于您使用的是ObservableCollection,因此它提供双向绑定,并且在添加本地对象时,UI中绑定的任何集合都会将此更改反映到最终用户身上。

但是,如果DbContext的生命只针对正在执行的“工作单元”,则随后每次使用DbContext进行的调用都应引入最新数据,因为您将使用DbContext/ObjectContext的。关于这方面的更多信息可以从以前的讨论中找到,我与另一位用户详细讨论了这个问题Here