【问题标题】:EF ComboBox not displaying SelectedItem BindingEF ComboBox 不显示 SelectedItem 绑定
【发布时间】:2013-09-19 10:34:56
【问题描述】:

我正在使用 Entity Framework 和 Caliburn.Micro 来实现一个 MVVM 应用程序。

基本上,我已将 AuthorModel 和 BookModel 设置为一对多关系 - 一个作者拥有多本书,而一本书只有一个作者。

我有一个 SelectBookWindow,我在其中使用 DbContext 加载 ObservableCollection<Book>,从中选择我想要查看/编辑的书。然后,我将选定的 Book 作为参数传递给 EditBookWindow,其中我有一个组合框枚举所有作者,但选择了当前作者。

在这里,我使用不同的 DbContext 实例加载 ObservableCollection<Author>,并将其设置为组合框的 ItemsSourceSelectedItem="{Binding Author}"。 (AuthorBook 的虚拟属性)

ComboBox 正确显示作者列表。但是,它似乎没有将 Book's Author 显示为其 SelectedItem。

这是因为我使用了不同的 DbContext 实例吗?如果是这样,我该如何解决这个问题?

【问题讨论】:

  • 您可以将上下文与所选书籍一起传递到第二个窗口,但我不确定这是不是最好的主意...

标签: c# wpf entity-framework mvvm caliburn.micro


【解决方案1】:

是的。因为 ItemsSource 中的作者引用了不同的对象,尽管内容与绑定到 SelectedItem 的内容相同。

我对 EF 了解不多,我猜你可以为这两个实体使用相同的上下文。或者重写 Author 类的 equals(和 gethashcode)来比较内容,如果相同则返回 true。

【讨论】:

    【解决方案2】:

    正如 Eben 提到的,ItemsSource 引用的 Author 将是一个不同的对象(尽管它碰巧引用了同一个实体)。

    我认为您为两个窗口使用新的DbContext 的方法是正确的,如果您有持久/共享的DbContexts,您可能会遇到问题;使用新上下文加载 EditWindow、执行编辑并处理上下文是有意义的。

    一种选择是 Detach 您的 Book 实体从旧的 DbContextAttach 到您的新上下文:(这里有一个很好的解释 Entity Framework 4 - AddObject vs Attach)。

    我可能只喜欢使用传递的Book 实体从新上下文重新加载选定的Book,例如使用DbSet<TEntity>.Find,并使用检索到的实体绑定到SelectedItem(而不是您通过窗口传递的那个)。

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2015-06-28
      相关资源
      最近更新 更多