2014-01-17 69 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); 
}