在实体框架中调用 SaveChanges() 时,WPF Datagrid 未更新

问题描述 投票:0回答:1

我有一个小型 WPF / .NET 应用程序,并通过

System.Data.Entity
连接到 SQLite 数据库。
MainWindow
有一个按钮和一个文本框。

单击按钮时,必须将具有 id 的新元素添加到数据库中。它可以正确工作并更新数据网格。但如果当前 id 的元素已经存在,则 count 必须递增。此更改正确应用于数据库,但不适用于数据网格。

仅当我向下滚动直到它隐藏并将其恢复时,数据网格值才会更新。如何正确修复?

MainWindow.xaml.cs
代码如下:

public partial class MainWindow : Window
{
    private ProductContext _context;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Product newProduct = new Product() {
            Id = idTextBox.Text,
            Count = 1
        };

        Product oldProduct = _context.Products.Find(newProduct.Id);
        if(oldProduct!= null)
            oldProduct.Count++;
        else
            _context.Products.Add(newProduct);

        _context.SaveChanges();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _context = new ProductContext();

        _context.Products.Load();
        dataGrid.ItemsSource = _context.Products.Local;
    }

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        _input.Dispose();
    }
}

MainWindow.xaml
中DataGrid的代码:

<DataGrid AutoGenerateColumns="False" Name="dataGrid">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding Id}"/>
        <DataGridTextColumn Header="COUNT" Binding="{Binding Count}"/>
    </DataGrid.Columns>
</DataGrid>

数据库上下文:

public partial class ProductContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    public ProductContext () : base("name=ProductDB") { }
}

产品:

public class Product
{
    public string Id { get; set; }
    public int Count { get; set; }
}

我尝试添加

_context.Products.Load()
和其他一些不好的内容,但没有任何改变。

PS:如果我在与数据库通信时从根本上做错了什么,我将非常感谢您的建议

c# wpf sqlite entity-framework data-binding
1个回答
0
投票

我很偶然地找到了一个解决方案。如果类

Product
实现
INotifyPropertyChanged
接口,则数据网格会正确更新

public class Product : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string Id { get; set; }

    private int _count;
    public int Count 
    { 
        get
        {
            return _count;
        }
        set
        {
            _count = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count)));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.