【问题标题】:Rebind combobox to static ObservableCollection after inserting to database插入数据库后将组合框重新绑定到静态 ObservableCollection
【发布时间】: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


【解决方案1】:

不客气。

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

但是,如果 DbContext 的生命周期仅适用于正在执行的“工作单元”,那么每次使用 DbContext 的后续调用都应引入最新数据,因为您将使用 DbContext/ObjectContext 的新实例.有关这方面的更多信息,可以从我之前与另一位用户的讨论中找到,该用户详细阐述了这个Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多