2014-01-17 2 views
0

Я пытаюсь распространить мои изменения на моем ViewModel до Entity Framework, но мне трудно понять, как это сделать. Все объекты в моей инфраструктуре сущностей реализуют INotifyPropertyChanged. Вот мой VM класс:Распространение изменений в View-Model для объектов Entity Framework 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

Что мне нужно сделать, это добавить обработчик события 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 

Затем я добавил обработчик в мой суб новый()

AddHandler Users.CollectionChanged, AddressOf OnUsersCollectionChanged 
1

Как правило, у нас есть три основных слоя в нашем приложении; пользовательский интерфейс (представления), модели представления и доступ к базе данных. В представлениях обычно будет 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); 
} 
Смежные вопросы