首页 > 解决方案 > 重新加载实体不会触发 NotifyPropertyChanged

问题描述

我有两个属性,一个是一个名为的集合Items,另一个是一个Item. 集合绑定到 Datagrid,当我双击数据网格时,选择加载到Item绑定到文本框的Item.Name. 当我将文本修改到文本框中时,由于 UpdateSourceTrigger=PropertyChanged. 我的问题是,当我取消此更改时,我从 db 重新加载实体,_context.Entry(Item).Reload();OnPropertyChanged它从未触发。我也尝试OnPropertyChanged(nameof(Item))在重新加载后打电话,但没有成功。唯一似乎起作用的是休耕:

 _itemRepository.Reload(Item);
 Item.Name = Item.Name;
 //OnPropertyChanged(nameof(Post));

这是错误还是功能?如何在不使用此 hack 的情况下更新我的 UI。我在 .NET 5 和 EF Core 5 上使用 WPF。

商品型号:

public class Item : BaseEntity
{
    private string _name;

    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            OnPropertyChanged(nameof(Name));
        }
    }
}

更新:

直到我有时间在最小环境中进行测试,比如BionicCode 建议的,我得到了一个快速修复:

Datagrid.Items.Refresh();

标签: wpfentity-framework-core.net-5ef-core-5.0

解决方案


实体框架正在断开实体与 PropertyChanged 基础结构的连接,以提高内部实体操作期间的性能。您必须通过配置DbContext及其关联模型以使用适当的跟踪策略来显式启用属性更改传播。这是通过使用ModelBuilder.

例如,如果您的实体INotifyPropertyChanged单独实施,则将更改跟踪策略设置为ChangeTrackingStrategy.ChangedNotifications就足够了。如果它还实现了INotifyPropertyChanginguseChangeTrackingStrategy.ChangingAndChangedNotifications或任何其他适当的枚举值,包括启用更改的通知。请参阅ChangeTrackingStrategyenum以查找更多可用的配置值或获取说明。

要使用ModelBuilder你必须覆盖你的虚拟DbContext.OnModelCreating方法DbContext

public class ItemsContext : DbContext
{
  public DbSet<Item> Items { get; set; }

  ...

  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Item>()
      .HasChangeTrackingStrategy(ChangeTrackingStrategy.ChangedNotifications);
  }
}

推荐阅读