Привязка DataGridComboBoxColumn к другому списку, что DataSrid ItemsSource - PullRequest
0 голосов
/ 04 сентября 2018

Так что я относительно новичок в WPF, и одна из приятных особенностей, о которых мне говорили, - это настраиваемые столбцы в datagrids. Так вот мой вопрос.

У меня есть две таблицы базы данных, таблица Employee и таблица Occupation.

Таблица сотрудников

Employee table

Занятие

Occupation table

И, как вы видите, у меня есть внешний ключ, связывающий две таблицы. Поэтому в моем приложении я установил свой DataGrid ItemsSource = список сотрудников. В своей DataGrid я сам определил столбцы, я отключил свойство AutoGenerateColumns. У меня 4 колонки,

0: TextColumn

1: TextColumn

2: TextColumn

3: ComboBoxColumn

Итак, мой вопрос, как я могу установить для ItemsSource ComboBoxColumn (4-й столбец) список моего класса Occupation, отображающий описание занятия из внешнего ключа OccupationID? и заполнение поля со всеми описаниями занятий?

Мой код:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    List<Employee> employees;

    private void gridMain_Loaded(object sender, RoutedEventArgs e)
    {
        employees = EmployeeDataHandler.getAllEmployees();
        List<Occupation> occs = OccupationDataHandler.getAllJobs();
        dgEmployee.ItemsSource = employees;

    }        
}

class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Occupation { get; set; }
}

class Occupation
{
    public int ID { get; set; }
    public string Description { get; set; }
}

И мой код xaml:

<Grid x:Name="gridMain" Loaded="gridMain_Loaded">
    <DataGrid x:Name="dgEmployee" HorizontalAlignment="Left" Height="301" Margin="10,10,0,0" VerticalAlignment="Top" Width="498" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding ID}" ClipboardContentBinding="{x:Null}" Header="System ID"/>
            <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Name"/>
            <DataGridTextColumn Binding="{Binding Surname}" ClipboardContentBinding="{x:Null}" Header="Surname"/>
            <DataGridComboBoxColumn ClipboardContentBinding="{x:Null}" Header="Occupation" SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>
        </DataGrid.Columns>
    </DataGrid>

</Grid>

Большое спасибо, что нашли время, чтобы прочитать мой вопрос. Постскриптум Это все поддельные данные, поэтому не беспокойтесь об именах на скриншоте

1 Ответ

0 голосов
/ 04 сентября 2018

Дайте элементу DataGridComboBoxColumn x:Key в разметке XAML, а затем установите его свойство ItemsSource в обработчике событий:

private void gridMain_Loaded(object sender, RoutedEventArgs e)
{
    employees = EmployeeDataHandler.getAllEmployees();
    List<Occupation> occs = OccupationDataHandler.getAllJobs();
    dgEmployee.ItemsSource = employees;
    cmb.ItemsSource = occs;
}

XAML:

<DataGridComboBoxColumn x:Name="cmb" ClipboardContentBinding="{x:Null}" 
                        Header="Occupation" 
                        SelectedValuePath="ID"
                        SelectedValueBinding="{Binding Occupation}"
                        DisplayMemberPath="Description "/>
...