Проблемы с combobox, отображением данных через binding
Не могу сделать нормальное отображение данных. Используя представление (рис.1), я могу добиться того, чтобы вместо id отображалось "человеко-читаемое" название. Но мне необходимо потом работать со строчками и представление тут не прокатит, насколько я понимаю.
Рис.1 представление
Рис. 2 так моя таблица выглядит в попытке вывести единицу измерения, без представления. Далее код, который работает на эту таблицу.
Model:
public class cabel_table
{
[Key]
public int idcabel_table { get; set; }
public string? cabel_name { get; set; }
public float? count { get; set; }
public string? commentary { get; set; }
// [ForeignKey("unitofmeasure")]
public int idunitofmeasure { get; set; }
// public virtual unitofmeasure_table unitofmeasure { get; set; }
}
public class unitofmeasure_table
{
/* public unitofmeasure_table()
{
this.Cabels = new ObservableCollection<cabel_table>();
} */
[Key]
public int idunitofmeasure_table { get; set; }
public string nameunitofmeasure_table { get; set; }
// public virtual ObservableCollection<cabel_table> Cabels { get; private set; }
}
Context:
public class SkladContext : DbContext
{
public DbSet<autorization_table> autorization_table { get; set; }
public DbSet<cabel_table> cabel_table { get; set; }
public DbSet<unitofmeasure_table> unitofmeasure_table { get; set; }
public DbSet<cabel_with_unit_view> cabel_with_unit_view { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
try
{
var connectionString = new MySqlConnectionStringBuilder
{
Server = "localhost",
Port = 3306,
UserID = "root",
Password = "1979",
Database = "waterfall",
}.ToString();
var serverVersion = ServerVersion.AutoDetect(connectionString);
optionsBuilder.UseMySql(connectionString, serverVersion);
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка подключения: {ex.Message}");
throw;
}
}
}
Grid:
<Grid Background="LightGray">
<DataGrid AutoGenerateColumns="False" x:Name="Cabel_table_Grid" ItemsSource="{Binding}" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding cabel_name}" Header="Кабель" Width="120"/>
<DataGridTextColumn Binding="{Binding count}" Header="Кол-во" Width="125"/>
<DataGridTextColumn Binding="{Binding unitofmeasure_table.nameunitofmeasure_table}" Header="Е/И" Width="80"/>
<DataGridTextColumn Binding="{Binding commentary}" Header="комментарий" Width="80"/>
<DataGridTemplateColumn Header="Редактировать" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Редактировать" x:Name="ButtonCabelEditor" Click="ButtonCabelEditor_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
xaml.cs:
private SkladContext _dbContext;
public MainMenu()
{
InitializeComponent();
_dbContext = new SkladContext();
LoadData();
}
private void LoadData()
{
var cabels2 = _dbContext.cabel_with_unit_view.ToList();
Cabel_table2_Grid.ItemsSource = cabels2;
//Загружаем данные из базы
try
{
var cabels = _dbContext.cabel_table
.ToList();
Cabel_table_Grid.ItemsSource = cabels;
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка загрузки данных: {ex.Message}");
}
}
private void ButtonCabelEditor_Click(object sender, RoutedEventArgs e)
{
// Получаем объект данных, связанный с нажатой кнопкой
var button = sender as Button;
var selectedCabel = button.DataContext as cabel_table; // Замените на ваш класс
// Проверяем, что строка выбрана
if (selectedCabel == null)
{
MessageBox.Show("Пожалуйста, выберите строку для редактирования");
return;
}
// Создаем и открываем окно редактирования
var editWindow = new Cabel.CabelEdit(selectedCabel);
editWindow.Owner = this; // Делаем текущее окно владельцем
editWindow.ShowDialog();
// Обновляем данные после редактирования
if (editWindow.DialogResult == true)
{
LoadData();
}
}
Я не могу использовать представление, потому что мне потом по кнопке Редактировать нужен переход на страницу, которая содержит данные выбранной строки. Тут также у меня проблема с combobox, оно не содержит ни данных с предыдущей страницы, так я еще поменять единицу измерения не могу.
grid:
<Grid>
<!-- Определение строк и столбцов -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- Название кабеля -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="Название кабеля" Margin="10,5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox x:Name="NameTextBox" Text="{Binding cabel_name}" Grid.Row="0" Grid.Column="1" Margin="10,5" VerticalAlignment="Center"/>
<!-- Кол-во -->
<TextBlock Grid.Row="1" Grid.Column="0" Text="Кол-во" Margin="10,5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox x:Name="CountTextBox" Text="{Binding count}" Grid.Row="1" Grid.Column="1" Margin="10,5" VerticalAlignment="Center"/>
<!-- Е/И -->
<TextBlock Grid.Row="2" Grid.Column="0" Text="Е/И" Margin="10,5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<ComboBox x:Name="unitofmeasureCB" SelectedValue="{Binding idunitofmeasure}" Grid.Row="2" Grid.Column="1" Margin="10,5" VerticalAlignment="Center">
<ComboBoxItem/>
</ComboBox>
<!-- Комментарий -->
<TextBlock Grid.Row="3" Grid.Column="0" Text="Комментарий" Margin="10,5" HorizontalAlignment="Right" VerticalAlignment="Center"/>
<TextBox x:Name="CommentaryTextBox" Text="{Binding commentary}" Grid.Row="3" Grid.Column="1"></TextBox>
<Button Width="70" Grid.Row="4" Grid.Column="1" x:Name="saveButton" Click="saveButton_Click" RenderTransformOrigin="-0.117,0.461">Сохранить</Button>
<Button Width="70" Grid.Row="4" Grid.Column="1" x:Name="deleteButton" Click="deleteButton_Click" RenderTransformOrigin="1.584,0.585" Margin="187,0,23,0">Удалить</Button>
</Grid>
xaml.cs:
public cabel_table _cabel;
public CabelEdit(cabel_table cabel)
{
InitializeComponent();
_cabel = cabel;
DataContext = _cabel;
}
private void saveButton_Click(object sender, RoutedEventArgs e)
{
if (_cabel != null)
{
DialogResult = true;
}
Close();
}
Подскажите, пожалуйста, как мне решить мою проблему с отображением и combobox?


