Невозможно добавить новую запись в БД с использованием сетки данных, связанной с коллекцией - PullRequest
0 голосов
/ 06 июня 2019

У меня есть WPF DataGrid, который связан с ObservableCollection, который заполняется с помощью запроса Entity Framework.Я могу вносить изменения в содержимое DataGrid, но по какой-то причине я не могу добавить новую запись.Я могу добавить данные в новую строку, но когда я нажимаю «Сохранить», новая запись никогда не сохраняется в базе данных.

Вот как объявлена ​​моя коллекция

public ObservableCollection<Camp> Camps { get; private set; }

заполнена

Camps = new ObservableCollection<Camp>( await ctx.Camps.Include( "Applications.Applicant" ).OrderByDescending( c => c.StartDate.Year ).ToListAsync() );

и привязана к сетке данных

<DataGrid MinHeight="300" ItemsSource="{Binding Camps}" SelectedItem="{Binding SelectedCamp}" AutoGenerateColumns="False"
                      CanUserResizeRows="True" CanUserResizeColumns="True" CanUserSortColumns="True" CanUserReorderColumns="True" CanUserAddRows="True">

Здесь сохраненометод, который должен добавить запись в DB

private async void SaveEntry()
{
    // Okay something is going on so that new records don't get added if they are created through the DG.
    var test = ctx.ChangeTracker.HasChanges(); // Just for testing

    if ( ctx.ChangeTracker.HasChanges() )
    {
        // Save changes
        await ctx.SaveChangesAsync();
    }
}

Когда я смотрю на «тест» var, ChangeTracker никогда не показывает true, когда я добавляю запись.Если я изменю существующую запись в сетке, она будет работать нормально.Не добавляется ли запись в коллекцию ObservableCollection при ее добавлении в сетку данных?Как я могу добавить запись из таблицы данных?

1 Ответ

1 голос
/ 07 июня 2019

Нет встроенной синхронизации между ObservableCollection<Camp> и контекстом, поэтому вы должны добавить новый Camp объект в ваш контекст, когда он будет добавлен в ObservableCollection<Camp>.Вы можете сделать это, обработав событие ObservableCollection CollectionChanged:

Camps.CollectionChanged += (ss, ee) =>
{
    switch(ee.Action)
    {
        case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
            Camp newObject = ee.NewItems[0] as Camp;
            ctx.Camps.Add(newObject);
            break;
    }
};
...