Как связать столбец DataGrid одновременно с 2-мя свойствами?

Рейтинг: 0Ответов: 1Опубликовано: 07.06.2023

У меня есть 2 таблицы DataGrid. Когда происходит выделение строки в 1-й таблице, возвращается пустая строка, в которую вводятся данные сущности базы данных. Одно из полей внешний ключ (LineId). Как сделать так, чтобы это поле устанавливалось автоматически? Вот, как делаю я на данный момент:

Таблица 1:

<DataGrid  x:Name="AllLines" Margin="5,10,5,5" 
                      AutoGenerateColumns="False" ColumnWidth="*" ItemsSource="{Binding Path=Lines,
                UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                        SelectedItem="{Binding SelectedLine, Mode=TwoWay}"
                       >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Название линии" Binding="{Binding Path=Name}"/>
                    <DataGridTextColumn Header="Источник" Binding="{Binding Path=Start}" / >
                    <DataGridTextColumn Header="Потребитель" Binding="{Binding Path=Finish}"/>
                    <DataGridTextColumn Header="Id" Binding="{Binding Path=LineId}"/>
      <DataGrid.Columns>
</DataGrid>

Таблица 2:

```<DataGrid  Margin="5,10,5,5" AutoGenerateColumns="False" ColumnWidth="*" 
                           ItemsSource="{Binding LineProperties, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="N участка" MinWidth="40" Binding="{Binding OrderNumber}" />
                        <DataGridTextColumn Header="IP" MinWidth="30" Binding="{Binding IP}"  />
                        <DataGridTextColumn Header="Длина, м" MinWidth="80" Binding="{Binding Length}" />
                        <DataGridTextColumn Header="LineId" Binding="{Binding Path=LineId}"/>
                       <DataGrid.Columns>
                </DataGrid>```

Затем, чтобы добавить введенные данные в базу данных, прохожусь циклом по всем итемам из второй таблицы и устанавливаю им свойство LineId по связанному свойству SelectedLine.Id:

foreach (LineProperties lineProperties in LineProperties)
                        {
                            lineProperties.LineId = SelectedLine.Id;
                        }
                       await requestRepository.AddPropertiesAsync(LineProperties);

Без этого не работает, т.к. LineId - внешний ключ и не может быть равен 0.

Сущности:

[Table("Lines")]
    public class Line
    {
        public int Id { get; set; }
        public int RequestId { get; set; }
        public string? Name { get; set; }
        public string? Start { get; set; }
        public string? Finish { get; set; }
        //check in
        public string Configuration { get; set; }
        //check in
        public int RatedCurrent { get; set; }
        //check in
        public string ConductorsMaterial { get; set; }
        //enum
        public string IP { get; set; }
        public IEnumerable<LineProperties>? Properties { get; set; }
        public Request Request { get; set; }

    }

[Table("LineProperties")]
    public class LineProperties
    {
        public int Id { get; set; }
        public int LineId { get; set; }
        public int OrderNumber { get; set; }
        public string IP { get; set; }

        private float length;
        public float Length
        {
            get => length;
            set { 
                length = value;
                FixingHangers = (int)(length / 1.5);
            }
        }
        public int? Elbows { get; set; }
        public int? TermSwg { get; set; }
        public int? TermTr { get; set; }
        public int? TElbows { get; set; }
        public int? FireBarriers { get; set; }
        public int? EndCaps { get; set; }
        public int? ExpJoints { get; set; }
        public int? EndBoxes { get; set; }
        public int? CenterEndBoxes { get; set; }
        public int FixingHangers { get; set; }
        
        public List<TapOffBoxes>? Boxes { get; set; }

        public string? Remarks { get; set; }
        public List<Reductions>? Reductions { get; set; }

    }

Идея вот в чем: связать столбец LineId во 2-й таблице одновременно с двумя объектами: 1) SelectedLine.Id 2) поле LineId сущности LineProperties. Есть ли способ?

Ответы

▲ 0

Описано всё мутно, но как я понял, нужно, чтобы при выборе в одном Датагриде что-то соответствующее выбиралось в другом. Это делается с помощью обработки события CurrentCellChanged (взято из DataGridView, есть ли в DataGrid - не знаю, должно быть). В обработчике получить текущую строку с помощью CurrentRow, а в ней - нужное поле с помощью Cells. А потом выставить что нужно во втором Датагриде.

В ответ на комментарий. Пусть в первом и втором Датагриде Id в первом поле:

void DataGridView1_CurrentCellChanged(...) {
    DataGridView2.CurrentRow.Cells[0].Value = DataGridView1.CurrentRow.Cells[0].Value;
}