当实体集 ChangeTracker 发生更改时如何通知 UI

Posted

技术标签:

【中文标题】当实体集 ChangeTracker 发生更改时如何通知 UI【英文标题】:How to notify UI when Entity set ChangeTracker has changes 【发布时间】:2018-07-01 18:37:33 【问题描述】:

我创建了一个WPFMVVM 应用程序,它对Entity 集合执行一些CRUD 操作。

在 UI 中我有一个保存/提交button,我想做的是在我的ViewModel 中创建一个事件或notificationView,当Entity 设置ChangeTracker 有任何更改并将其绑定到button 上的IsEnabled

我怎样才能做到这一点?

我知道我可以利用以下属性:

dbcontext.ChangeTracker.HasChanges();

db.ChangeTracker.Entries().Any(e => e.State == EntityState.Added
                                 || e.State == EntityState.Modified
                                 || e.State == EntityState.Deleted);

我只是不确定如何实现它

【问题讨论】:

在您的视图模型中创建一个布尔属性,并实现 INotifyPropertyChanged 接口。将您的客户业务逻辑放入 getter 和 setter 中,然后在您需要时提出属性更改。 谢谢,但我想我需要从 dbContext.ChangeTracker.HasChanges 或那里引发属性更改事件 【参考方案1】:

我会在 ViewModel 上实现以下属性:

public bool dbHasChanges => dbcontext.ChangeTracker.HasChanges();

然后在 XAML 中绑定到它:

<Button IsEnabled="Binding dbHasChanges" />

然后,每当数据库更新时,就会在该属性上引发属性更改通知:

NotifyPropertyChanged("dbHasChanges");

这适用于仅在您的应用程序中更改数据库的情况(每当用户进行更改时,您都将执行上述代码)。

您还可以将其重构为一个方法,这样您就不会多次硬编码属性名称:

private void DBChangeOccured()

    NotifyPropertyChanged("dbHasChanges");

然后您可以只调用此方法而不是 NotifyPropertyChanged

更新

您可以在 .NET Core 中使用,而不是使用单独的方法来防止对属性名称进行硬编码:

NotifyPropertyChanged(nameof(dbHasChanges));

【讨论】:

以上是关于当实体集 ChangeTracker 发生更改时如何通知 UI的主要内容,如果未能解决你的问题,请参考以下文章

EF ChangeTracker 访问被跟踪实体及其导航集合

当 UI 允许新对象时如何处理取消

使用实体框架恢复数据库中的更改

更新CoreData模型版本时如何为实体的新属性设置默认值

仅当特定文件集发生更改时如何触发构建

[当PHP代码失败但发送200时如何处理AJAX?