Как правильно сгенерировать колонки?

Работаю на WPF. Суть такая: Загружаю из mysql БД в DataTable таблицу, так:

public void GetTableData(string curTable)
    {
        cmd = new MySqlCommand($"SELECT * FROM {curTable};", conn);
        reader = cmd.ExecuteReader();
        dt.Load(reader);
    }

Привязываю к DataGrid:

public MainWindow()
    {
        InitializeComponent();
        DataContext = App.connection; // класс viewmodel
        DataGrid_main.ItemsSource = App.connection.DataTableView.DefaultView;
    }

Еще пробовал так

public DataTable DataTableView
    {
        get
        {
            return dt;
        }
        set
        {
            dt = value;
            OnPropertyChanged("DataTableView");
        }
    }
<DataGrid x:Name="DataGrid_main" Margin="0,25,0,0" AutoGenerateColumns="True" ItemsSource="{Binding DataTableView}"/>

В DataTable данные загружаются, есть вся информация о таблицу, начиная от количества строк и столбцов, заканчивая их значениями и названиями. Визуализатор DataTable вот что показывает (собственно то как мне и надо что б показывалось в DataGrid) введите сюда описание изображения

Но пытаясь вывести это в таблицу DataGrid с автогенерацией столбцов, получаю то что ниже на скрине. Причем как я понял столбцов самих нет, но количество строк точно в районе 3600 которые собственно находятся в базе. Испробовал датасет с датаАдаптером, эффект тот же. Уже не знаю куда копать... введите сюда описание изображения


Ответы (1 шт):

Автор решения: aepot

1) Загружать надо в свойство, а не в поле. Вообще вне сеттера свойства лушче не обращаться к полю этого свойства.

public void GetTableData(string curTable)
{
    cmd = new MySqlCommand($"SELECT * FROM {curTable};", conn);
    reader = cmd.ExecuteReader();
    DataTable table = new DataTable();
    table.Load(reader);
    DataTableView = table;
}

2) В целях упрощения рефакторинга рекомендую использовать nameof в свойствах, иначе при переименовании свойства вы можете поломать приложение, забыв поменять строчку.

public DataTable DataTableView
{
    get => dt;
    set
    {
        dt = value;
        OnPropertyChanged(nameof(DataTableView));
    }
}

3) Уберите лишнее присвоение ItemsSource, у вас есть Binding, пусть он это все обслуживает. (скорее всего здесь и кроется ваша исходная проблема)

public MainWindow()
{
    InitializeComponent();
    DataContext = App.connection;
}

4) И если у вас где-то есть такое

dt = new DataTable();

Замените его на

DataTableView = new DataTable();

Иначе не будет толку от OnPropertyChanged()

Кстати, AutoGenerateColumns="True" - это дефолтное значение для DataGrid, то есть можно убрать, и ничего не поменяется.

→ Ссылка