将视图模型更改传播到实体框架 6.0 实体时出现问题



我正在尝试将我的 ViewModel 上的更改向下传播到实体框架,但无法理解如何做到这一点。 我的实体框架中的所有实体都实现了 INotifyPropertyChanged。 这是我的虚拟机类:

Imports System.Collections.ObjectModel
Imports System.ComponentModel
Public Class MainWindowVM
    Implements INotifyPropertyChanged
    Dim dbcontext As New FootballPoolEntities
    Private _Users As ObservableCollection(Of User)
    Private _Settings As ObservableCollection(Of ScheduleSetting)
    Public Property Users As ObservableCollection(Of User)
        Get
            Return _Users
        End Get
        Set(value As ObservableCollection(Of User))
            _Users = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Users"))
        End Set
    End Property
    Public Property Settings As ObservableCollection(Of ScheduleSetting)
        Get
            Return _Settings
        End Get
        Set(value As ObservableCollection(Of ScheduleSetting))
            _Settings = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Settings"))
        End Set
    End Property

    Public Sub New()
        'dbcontext = New FootballPoolEntities
        _Users = New ObservableCollection(Of User)(dbcontext.Users.ToList)
        _Settings = New ObservableCollection(Of ScheduleSetting)(dbcontext.ScheduleSettings.ToList)
    End Sub
    Public Sub Save()
        dbcontext.SaveChanges()
    End Sub
    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
End Class

我知道我现在需要使用 collectionchanged 事件将这些更改更新到我的 dbcontext,但不清楚如何实现它。

任何指导将不胜感激。

通常,我们的应用程序中有三个主要层; UI(视图),视图模型和数据库访问。视图通常具有供用户输入或编辑值的TextBox es等,以及供用户保存更改的保存Button。因此,保存数据以响应Button Command比保存CollectionChanged事件更为常见。

因此,您的视图模型是定义Command的地方(如果您使用的是某种delegate Command),并且应该有权访问数据库访问层。因此,通常只需执行以下操作即可保存数据:

public ICommand SaveCommand
{
    get { return new ActionCommand(action => Save(), 
        canExecute => CanSave(AudioTrack)); }
}
...
private void Save()
{
    if (AudioTrack.IsNew) Model.AddAudioTrack(AudioTrack);
    else Model.UpdateAudioTrack(AudioTrack);
}

我需要做的是向 CollectionChanged 事件添加一个处理程序,该处理程序添加了新的对象或从 dbcontext 集合中删除了已删除的对象。

    Private Sub OnUsersCollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
        If e.Action = NotifyCollectionChangedAction.Add Then
            For Each item In e.NewItems
                dbcontext.Users.Add(item)
            Next
        End If
        If e.Action = NotifyCollectionChangedAction.Remove Then
            For Each item In e.OldItems
                dbcontext.Users.Remove(item)
            Next
        End If
    End Sub

然后我在我的子 new() 中添加了一个处理程序

AddHandler Users.CollectionChanged, AddressOf OnUsersCollectionChanged

最新更新