2013-09-15 2 views
4

Я использую Entity Framework и Caliburn.Micro для реализации приложения MVVM.EF ComboBox не отображает привязку SelectedItem

В принципе, я создал AuthorModel и BookModel в отношениях друг к другу - Автор, имеющий несколько книг и книг, имеющих только одного автора.

У меня есть SelectBookWindow, где я использую DbContext для загрузки ObservableCollection<Book>, откуда я выбираю книгу, которую я хочу просмотреть/редактировать. Затем я передаю выбранную книгу в качестве параметра в EditBookWindow, где у меня есть combobox, перечисляющий все авторы, но с выбранным автором.

Здесь я загружаю ObservableCollection<Author> с использованием другого экземпляра DbContext и устанавливаю его как ItemsSource combobox, а также SelectedItem="{Binding Author}". (Author является виртуальной собственностью Book)

ComboBox отображает список авторов правильно. Однако, похоже, он не отображает автора книги как свой SelectedItem.

Это потому, что я использую другой экземпляр DbContext? Если да, то как я могу исправить эту проблему?

+1

Вы можете передать контекст ко второму окну вместе с выбранной книгой, хотя я не уверен, что это лучшая идея ... – UIlrvnd

ответ

3

Да, это так. Поскольку автор в ItemsSource ссылается на другой объект, хотя содержимое такое же, как тот, который привязан к SelectedItem.

Я мало знаю о EF, я думаю, вы можете использовать один и тот же контекст для двух объектов. Или переопределите equals (и gethashcode) класса Author для сравнения содержимого, а затем верните true, если оно то же самое.

1

Как упоминает Эбен, ссылка Author, на которую ссылается ItemsSource, будет другим объектом (хотя это относится к тому же объекту).

Я думаю, что ваш подход к использованию нового DbContext для обоих ваших окон верен, вы можете столкнуться с проблемами, если у вас есть/DbContexts; имеет смысл загрузить EditWindow с новым контекстом, выполнить ваши изменения и избавиться от контекста.

Одним из вариантов является Detach вашего Book объекта от старого DbContext и Attach его в новый контекст: (хорошее объяснение здесь Entity Framework 4 - AddObject vs Attach).

Я бы, вероятно, просто одобрил использование переданного объекта Book для перезагрузки выбранного Book из нового контекста, например. используя DbSet<TEntity>.Find и используя этот восстановленный объект для привязки к SelectedItem (а не тот, который вы просматриваете через окна).

Смежные вопросы