EF ComboBox不显示SelectedItem绑定

时间:2013-09-15 02:22:08

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

我对EF知之甚少,我猜你可以为这两个实体使用相同的上下文。或者覆盖Author类的equals(和gethashcode)来比较内容,如果相同则返回true。

答案 1 :(得分:1)

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

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

一个选项是Detach来自旧Book的{​​{1}}实体,DbContext实体到您的新背景:(这里有一个很好的解释Entity Framework 4 - AddObject vs Attach )。

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