【问题标题】:Reloading an entity does not trigger NotifyPropertyChanged重新加载实体不会触发 NotifyPropertyChanged
【发布时间】:2021-08-20 09:05:17
【问题描述】:

我有两个属性,一个是名为Items 的集合,另一个是Item。该集合绑定到一个数据网格,当我双击数据网格时,选择被加载到Item,它通过Item.Name 绑定到一个文本框。当我将文本修改到文本框中时,由于UpdateSourceTrigger=PropertyChanged,更改会反映到 Datagrid 中。我的问题是,当我取消此更改时,我使用_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 sugested,我得到了快速修复:

Datagrid.Items.Refresh();

【问题讨论】:

  • 你能展示你的模型类吗?

标签: wpf entity-framework-core .net-5 ef-core-5.0


【解决方案1】:

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

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

要使用ModelBuilder,您必须覆盖DbContext 中的虚拟DbContext.OnModelCreating 方法:

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

【讨论】:

  • 我必须做错事,因为我得到了相同的结果。我会尝试更深入地了解ChangeTrackingStrategy。谢谢!
  • 如果这不能解决问题,那么您的代码肯定有更多问题。我建议建立一个具有最小测试环境的空白项目,看看修复是否有效。然后将其与您的生产环境进行比较。
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2013-12-27
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多