Перезагрузить 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 шт):
Здесь проблема состоит из двух частей:
- Как обновить содержимое DataGrid при изменении коллекции, к которой привязан ItemsSource
- Как обновить саму коллекцию при обновлении данных в БД.
Первая проблема решается использованием 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();
}
}
}