wpf - 重新加载实体不会触发 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();
解决方案
实体框架正在断开实体与 PropertyChanged 基础结构的连接,以提高内部实体操作期间的性能。您必须通过配置DbContext
及其关联模型以使用适当的跟踪策略来显式启用属性更改传播。这是通过使用ModelBuilder
.
例如,如果您的实体INotifyPropertyChanged
单独实施,则将更改跟踪策略设置为ChangeTrackingStrategy.ChangedNotifications
就足够了。如果它还实现了INotifyPropertyChanging
useChangeTrackingStrategy.ChangingAndChangedNotifications
或任何其他适当的枚举值,包括启用更改的通知。请参阅ChangeTrackingStrategy
enum以查找更多可用的配置值或获取说明。
要使用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);
}
}
推荐阅读
- javascript - 节点 JS 对象返回未定义
- rest - 发送 HTTP 请求并在 Visual Studio 中查看响应
- c - Mingw-w64 gcc 中的 memmem()
- google-maps - 我想将 props(origin, destination) 传递给 Map.js 以用于 DirectionsRenderer
- uikit - Scrollspy Uikit 3 框架和计数
- c# - 无法使用数组参数调用方法c#
- html - 曲线/斜线 CSS 或 SVG
- python - Python中每个句子的首字母大写
- closedxml.report - 使用 ClosedXML.Report 创建一个列表
- reactjs - 我将如何在除登录页面之外的所有组件上呈现我的 MUI 抽屉?