Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

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

Answer 1219542

Link

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

  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();
        }
    }
}

Content is retrieved from StackExchange API.

Auto-generated by ruso-archive tools.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX