当实体集 ChangeTracker 发生更改时如何通知 UI
Posted
技术标签:
【中文标题】当实体集 ChangeTracker 发生更改时如何通知 UI【英文标题】:How to notify UI when Entity set ChangeTracker has changes 【发布时间】:2018-07-01 18:37:33 【问题描述】:我创建了一个WPF
MVVM
应用程序,它对Entity
集合执行一些CRUD
操作。
在 UI 中我有一个保存/提交button
,我想做的是在我的ViewModel
中创建一个事件或notification
到View
,当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的主要内容,如果未能解决你的问题,请参考以下文章