@kodwi
https://moikrug.ru/kodwi

DataGridComboBoxColumn — как прибиндить поле из одной таблицы для отображения, и поле из другой — для значения?

Есть бд, есть DataGrid, есть 2 таблицы, связанные 1 к беск. Нужно, чтобы в гриде отображались данные из одной таблицы, и в одном из полей грида был ComboBox, в котором находились бы все связанные значения определенного столбца из другой таблицы. Например, первая таблица Календарь, в ней есть поле День недели, в котором лежит id дня из таблицы Дни недели. Нужно, чтобы в гриде в каждой записи в поле День недели отображался не один id, а комбобокс из названий дней недели, но при выборе другого дня, в записи менялся id (т.е. визуально в комбобоксе названия дней, а по факту их id).

Можно пример XAML'а?
  • Вопрос задан
  • 1902 просмотра
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C#
Так, давайте по порядку.

1. Для начала предположим что вы пользуетесь какой-либо ORM, ну или сами пишите SQL-запросы и преобразуете полученные результаты во вменяемые бизнес-объекты.
2. Допустим, у вас есть классы CalendarItem и DayOfWeek такого вида:
class CalendarItem
{
    ....
    public string DayOfWeek Day { get; set; }
    public string Text { get; set; }
}

class DayOfWeek
{
    ....
    public int Id { get; }
    public string Name { get; }
}


3. Теперь делаем датагрид с комбобоксом. Допустим у вас есть ObservableCollection<CalendarItem> Items. Тогда вам нужно привязать грид к этой коллекции, комбобокс (его выбранное значение) - к свойству Day элемента календаря, а то, что будет выведено в комбике в качестве текста - к св-ву Description класса DayOfWeek. Примерно это будет так:
<DataGrid x:Name="dataGrid1" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Path=Items}">
    <DataGrid.Columns>
        <DataGridComboBoxColumn x:Name="dayColumn" Header="День недели" Width="200" SortMemberPath="Day.Id" DisplayMemberPath="Description" SelectedValueBinding="{Binding Path=Day}" />
        <DataGridTextColumn x:Name="textColumn" Header="Описание события" Binding="{Binding Path=Text}" />
    </DataGrid.Columns>
</DataGrid>

Заодно с сортировкой по айдишнику.
Попробуйте это все, если что непонятно - в комментарии, разберемся. Пока попробуйте без считывания из базы, чтобы было проще, просто создайте объекты дней недели и несколько CalendarItem-ов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы