我正在使用EF和MVVM。 我的模型包含这个:
Public Property Visits As DbSet(Of Visit)
Visit类实现了INotifyPropertyChanged,其属性正确地引发了PropertyChanged事件。
我的ViewModel包含这些属性,用于我的视图绑定(context是我的模型):
Private _BareVisits As ObservableCollection(Of Visit)
Public Property BareVisits As ObservableCollection(Of Visit)
Get
If _BareVisits Is Nothing Then
_BareVisits = New ObservableCollection(Of Visit)(context.Visits)
AddHandler _BareVisits.CollectionChanged, AddressOf BareVisits_CollectionChanged
End If
Return _BareVisits
End Get
Set(value As ObservableCollection(Of Visit))
_BareVisits = value
End Set
End Property
Private _Visits As ObservableCollection(Of Visit)
Public Property Visits As ObservableCollection(Of Visit)
Get
If _Visits Is Nothing Then
_Visits = New ObservableCollection(Of Visit)(
BareVisits.Where(
Function(V) Not V.IsMediGenerated AndAlso V.IsHistoryParseComplete
)
)
End If
Return _Visits
End Get
Set(value As ObservableCollection(Of Visit))
_Visits = value
End Set
End Property
Private Sub BareVisits_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
Select Case e.Action
Case NotifyCollectionChangedAction.Add
context.Visits.AddRange(e.NewItems.OfType(Of Visit))
context.SaveChanges()
Case NotifyCollectionChangedAction.Remove
context.Visits.RemoveRange(e.OldItems.OfType(Of Visit))
context.SaveChanges()
Case Else
Exit Sub
End Select
End Sub
如您所见, BareVisits 属性只是我访问的数据库集合。
访问次数属性(我的视图绑定的属性)依赖于 BareVisits 来返回已过滤的记录。
问题:
1)保存新访问的最佳方法是哪种?通过使用发布的事件处理程序?或者我应该直接与模型交谈,并以某种方式将此更改冒泡到ViewModel?如果我将CollectionChanged处理程序挂钩到Visits属性,我是否需要这个BareVisits属性?
2)假设更改发生在模型本身,我想我也应该对BareVisits属性执行记录添加/删除。 Visits属性会怎样? (已过滤的)我已尝试过所有内容,其CollectionChanged事件永远不会被触发。我也应该手工篡改吗?
我只是想让我的观点描绘出数据变化,而我却不知所措。
编辑:我还尝试使用ICollectionView来过滤原始数据(而不是新的ObservableCollection属性),但它不是一个选择,因为我的数据网格中的数据以这种方式呈现为不可编辑的。
提前谢谢你。任何帮助将不胜感激。