Model - ViewModel同步和过滤的ObservableCollections

时间:2014-06-14 13:41:16

标签: wpf vb.net mvvm filtering observablecollection

我正在使用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属性),但它不是一个选择,因为我的数据网格中的数据以这种方式呈现为不可编辑的。

提前谢谢你。任何帮助将不胜感激。

0 个答案:

没有答案