WPF MVVM ListView не обновляется при вставке новой записи в БД - PullRequest
0 голосов
/ 08 октября 2019

У меня небольшая проблема с 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).

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

1 Ответ

1 голос
/ 09 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...