MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Перезагрузить DataGrid WPF , который загружает данные из списка БД"
Answer 1219542
Здесь проблема состоит из двух частей:
- Как обновить содержимое 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(); } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.