Привязка DataGridComboBoxColumn к связи структуры сущностей один ко многим - PullRequest
1 голос
/ 10 мая 2010

У меня есть две таблицы в модели, одна таблица содержит записи, связанные с другой таблицей в отношениях один ко многим, например:

Table User
  ID
  Name

Table Comments
  ID
  UserID
  Title
  Text

Я хочу показать сетку данных в окне WPF с двумя столбцами, одним текстовым столбцом с именем пользователя и другим столбцом с полем со списком, отображающим все комментарии, сделанные пользователем.

Определение таблицы данных выглядит следующим образом:

        <DataGrid AutoGenerateColumns="False" [layout options...] Name="dataGrid1" ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
            <DataGridComboBoxColumn Header="Comments"
                SelectedValueBinding="{Binding Path=UserID}"
                SelectedValuePath="ID"
                DisplayMemberPath="Title"
                ItemsSource="{Binding Path=Comments}"
                />
        </DataGrid.Columns>
    </DataGrid>

в коде я присваиваю DataContext следующим образом:

dataGrid1.DataContext = entities.Users;

У сущности User есть свойство с именем Comments, которое ведет ко всем комментариям, сделанным пользователем. Запросы возвращают данные и отображаются имена пользователей, но поле со списком не заполняется.

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

Спасибо

1 Ответ

1 голос
/ 14 мая 2010

Я на самом деле уже использовал ваш подход. Это работает, но с оговоркой: выпадающий список может показывать текущий элемент только для данного объекта, если он находится в списке разрешенных значений (здесь entities.Users).

Вы скажете: «Да, но это так! Я поместил весь список Users». К сожалению, это не так. Сравнение по умолчанию для entites в EF не основано на EntityKeys (я предполагаю, что это сравнение по умолчанию, то есть сравнение ссылок), поэтому в объекте у вас есть ссылка на один объект, abd в списке, у вас есть ссылка на другой (с тем же EntityKey для обоих).

Мое решение - переопределить функцию сравнения для класса User, просто проверив ID == ID. Заметьте, я не говорю, что это лучший подход (например, он может иметь нежелательные последствия в остальной части вашего кода), просто он хорошо сработал для меня.

Да, и общая рекомендация состоит не в том, чтобы привязывать непосредственные элементы управления к IQueriables, а к результату функции Execute (иначе запрос будет дважды выполняться к базе данных), см. msdn подробности.

...