我正在尝试将我的 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