Перезагрузить DataGrid WPF , который загружает данные из списка БД

Никак не могу перезагрузить DataGrid в окне при добавлении или изменении элементов. Причем при удалении список обновляется, а при добавлении нет

Функция обновления SpisokCassirov - dataGrid

CrudOperation BD = new CrudOperation();
List<CashierModel> cashiers;
 public Admin()
        {
            InitializeComponent();
            cashiers = BD.CashierList();
            Fill1();
        }
void Fill1()
        {
            SpisokCassirov.ItemsSource = cashiers;
        }
private void UpdWindow(object sender, RoutedEventArgs e)
{
    SpisokCassirov.ItemsSource = null;
    SpisokCassirov.ItemsSource = BD.CashierList();
}

Список кассиров в CrudOperation

public List<CashierModel> CashierList()
{
    return bd.Cashier.ToList().Select(i => new CashierModel(i)).ToList();
}

Data-Grid xaml

 <DataGrid Margin="0,32,0,0" AutoGenerateColumns="False" x:Name="SpisokCassirov">
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Path=Id}" Header="Идентификатор" Width="100"/>
                            <DataGridTextColumn Binding="{Binding Path=FIO}" Header="Название" Width="*"/>
                            <DataGridTextColumn Binding="{Binding Path=Login}" Header="Название" Width="*"/>
                            <DataGridTextColumn Binding="{Binding Path=Password}" Header="Название" Width="*"/>
                        </DataGrid.Columns>
                    </DataGrid>

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

Автор решения: MSDN.WhiteKnight

Здесь проблема состоит из двух частей:

  1. Как обновить содержимое DataGrid при изменении коллекции, к которой привязан ItemsSource
  2. Как обновить саму коллекцию при обновлении данных в БД.

Первая проблема решается использованием ObservableCollection, который автоматически обновляет привязанные контролы. Для второй нужен явный код обновления, так как классы для работы с БД не реализуют подобный автоматический механизм. Проще всего использовать INotifyPropertyChanged и двухсторонние привязки.

Пусть модель у нас будет такой:

public class Cashier
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class MyContext : DbContext
{
    public MyContext(DbConnection con) : base(con, true)
    {

    }

    public DbSet<Cashier> Cashiers { get; set; }                
}

Тогда вот так мы можем реализовать обновление данных в DataGrid:

<DataGrid x:Name="SpisokCassirov" HorizontalAlignment="Left" Height="150" 
    ItemsSource="{Binding Cashiers, Mode=TwoWay}"
    Margin="30,103,0,0" VerticalAlignment="Top" Width="400"/>

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Data;
using System.Data.Entity;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace WpfApp1
{
    public partial class MainWindow : Window,INotifyPropertyChanged
    {
        ObservableCollection<Cashier> cashiers;

        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<Cashier> Cashiers
        {
            get { return this.cashiers; }

            set
            {
                this.cashiers = value;
                OnPropertyChanged(nameof(Cashiers));
            }
        }

        void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }

        public MainWindow()
        {
            InitializeComponent();            
        }

        void LoadData()
        {
            //загрузка данных из БД
            DbConnection con = new SqlConnection(
                @"Data source=.\SQLEXPRESS;Initial catalog=base;Integrated security=True;"
                );
            con.Open();
            MyContext entities = new MyContext(con);

            using (entities)
            {                
                this.Cashiers = new ObservableCollection<Cashier>(entities.Cashiers.ToList());
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            LoadData();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = this;
            SpisokCassirov.AutoGenerateColumns = true;
            LoadData();
        }
    }
}
→ Ссылка