WPF MVVM ListView не обновляется при вставке новой записи в БД

У меня небольшая проблема с ListView в приложении WPF MVVM. В моем проекте используется файл базы данных Sqlite с Dapper-Contrib. Я могу успешно добавить нового сотрудника, но мой ListView после этого не обновится.

Мой код выглядит так: SqlRepository.cs (общая функция)

public IList<TEntity> GetAll()
{
    return DbContext.Connection.GetAll<TEntity>().ToList();
}

ISqlRepository.cs (интерфейс)

IList<TEntity> GetAll();

EmployeeViewModel.cs (ViewModel для моего основного представления)

using Autofac;
using AutoMapper;
using Calendar.Commands;
using Calendar.Database.Entities;
using Calendar.Database.Repositories;
using Calendar.Models;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;

namespace Calendar.ViewModels
{
    internal class EmployeeViewModel : ViewModelBase
    {
        private RelayCommand command;
        ObservableCollection<EmployeeEntity> m_lstEmployees = new ObservableCollection<EmployeeEntity>();
        /// <summary>
        /// Initializes a new instance of the EmployeeViewModel class.
        /// </summary>
        public EmployeeViewModel()
        {
            employee = new Employee();

        }
        public Employee employee
        {
            get;
            set;
        }
        public RelayCommand AddNewEmployee
        {
            get
            {
                this.command = new RelayCommand(SaveChanges);
                return this.command;
            }
        }
        public void SaveChanges()
        {
            var container = ContainerConfig.Configure();
            using (var scope = container.BeginLifetimeScope())
            {
                var test = scope.Resolve<IEmployeeRepository>();
                employee.FirstName = this.employee.FirstName;
                employee.LastName = this.employee.LastName;
                var config = new MapperConfiguration(cfg => cfg.CreateMap<Employee, EmployeeEntity>());
                var mapper = config.CreateMapper();
                var test99 = mapper.Map<EmployeeEntity>(employee);
                test.Add(test99);
            }
        }
        public ObservableCollection<EmployeeEntity> EmployeeList
        {
            get
            {
                var container = ContainerConfig.Configure();
                using (var scope = container.BeginLifetimeScope())
                {
                    var test = scope.Resolve<IEmployeeRepository>();
                    IList<EmployeeEntity> gugus = test.GetAll();
                    foreach (var item in gugus)
                    m_lstEmployees.Add(item);
                }
                return m_lstEmployees;
            }
        }
    }
}

MainWindow.xaml

<ListView ItemsSource="{Binding EmployeeList, UpdateSourceTrigger=PropertyChanged}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}"/>
                    <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}"/>
                </GridView>
            </ListView.View>
        </ListView>

Я знаю, что мне нужен ObservableCollection, чтобы PropertyChanged мог запускаться (EmployeeViewModel наследует ViewModelBase, который содержит материал InotifyPropertyChanged).

Кажется, что нет никакой "обратной связи" при добавлении новой записи в мою базу данных. Что я пропустил?


person Moritz    schedule 08.10.2019    source источник


Ответы (1)


Попробуйте вызвать OnPropertyChanged(nameof(EmployeeList)) после сохранения изменений в базе данных (возможно, в методе SaveChanges()). Разметка XAML должна знать, когда переоценивать EmployeeList в привязке ItemSource представления списка. Под OnPropertyChanged я имею в виду метод в вашем ViewModelBase, который вызывает событие PropertyChanged из INotifyPropertyChanged (возможно, у вас может быть другое имя)

person Pavel Anikhouski    schedule 09.10.2019
comment
Сделал что-то подобное: добавил EmployeeList.Add (employee); в мой метод SaveChanges (), и теперь он работает. Ну, не совсем так (текстовые поля не пустые после сохранения изменений, но это другая проблема), поэтому мне действительно нужно улучшить свои навыки программирования: в любом случае, большое спасибо :) - person Moritz; 09.10.2019