2014-01-17 38 views
0

我试图将我的ViewModel上的更改传播到实体框架,但无法理解如何做到这一点。我的实体框架中的所有实体都实现INotifyPropertyChanged。这里是我的VM类:错误传播视图模型更改为实体框架6.0实体

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,但我不清楚究竟是如何实现它。

任何指导将不胜感激。

回答

0

我需要做什么是一个处理程序添加到其中添加了新的或删除的删除对象从的DbContext收集CollectionChanged事件。

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 

然后我在亚新()增加了一个处理程序

AddHandler Users.CollectionChanged, AddressOf OnUsersCollectionChanged 
1

通常,我们在应用程序中有三个主要层; 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); 
}