【发布时间】:2013-01-07 02:31:26
【问题描述】:
我有一个静态变量来从数据库中检索组列表。
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 行插入数据库。成功插入数据库后,我的组合框没有改变。我想要的是我的组合框会立即更新。
据我了解,我需要以某种方式更新 static GroupList 的属性,以便我与组合框的绑定再次起作用。知道如何实现这一目标吗?
作为旁注,我使用这种方法,因此我只需要编写 1 次代码即可从数据库中检索组列表,并且无需在后面的代码中编写多行代码。使用这种方法,我只需要 ItemsSource="{Binding Source={x:Static wpf:Group.GroupList}}" 来绑定组合框。
【问题讨论】:
-
当您将新组添加到“文本框”时,您是将其添加到组合框绑定到的集合中,还是仅使用该值更新数据库?我对 WPF 的使用还不够,因为绑定可能与 winforms 略有不同,但如果您只是在数据库中插入新值而不更新本地 ObservableCollection,那么您不需要使用这些值重新加载/刷新集合从数据库中识别新值?
-
这正是问题所在。组合框绑定到的集合不是手动添加的,我也不使用后面的代码来调用该方法。一切都是通过 xaml 完成的。话虽如此,在我将新数据插入数据库后我没有添加项目集合,我不想这样做。我只是希望 WPF 重新评估 Group.GroupList 的 bindingsource 属性。
-
您的本地 ObservableCollection 不会知道对数据库所做的任何更改,因为上下文只知道附加到它并正在跟踪的实体发生的任何更改。如果您在上下文之外更新数据库,它不会看到这一点并且不会显示新记录,因为它只显示您的本地集合。您需要重新查询数据库或将其添加到本地集合中。您不能手动将其添加到本地集合中,然后调用 SaveChanges() 吗?然后上下文会自动为您将其添加到数据库中。
-
我尝试在后面的代码中再次设置 itemsource,并且成功了。我只是认为如果有像'cmbGroup.Bind();'这样的更简洁的方法会更好,所以我或其他团队成员不需要记住组合框绑定到哪个方法。因为在更大规模的应用程序中,要记住的东西太多了,所以基本上我只是想尽量减少它。但是,如果没有这种方法,我想我会坚持自己重新查询数据库。感谢您的意见。
-
@NuNnDaDdY 正如 vugtis 正确提到的,您的 ObservableCollection 将不知道对数据库所做的任何更改。我建议不要从静态属性进行数据库调用,因为它只会被初始化一次。如果您的意图是捕获集合,请调用 Groups.getGroups() 并将其值分配给静态 ObservableCollection。看到这个帖子:link
标签: c# wpf data-binding static