Я пишу приложение, которое делает что-то подобное. Я, однако, использую шаблон MVVM, который позволяет мне делать некоторые изящные вещи. По моему я работаю с отгрузками. На ShipmentsView я могу нажать кнопку «Добавить новый», которая запускает привязанное свойство команды, которое находится в связанном классе ViewModel. Методы этой команды выглядят следующим образом: Примечание. Представления в этом контексте не являются CollectionView, но ссылаются на классы представления MVVM.
Dim NewShipment = New Shipment()
_Context.AddToShipments(NewShipment)
Dim ShipVM = New ShipmentViewModel(NewShipment)
ShipmentVMCollection.Add(ShipVM)
Dim NewShipmentView as ShipmentView(ShipVM)
Мой ShipmentView обрабатывает его размещение и видимость, а мой объект Shipment имеет свои значения свойств, инициализированные так, что он не сразу представляет ошибки через свои обработчики проверки. Таким образом, пользователь может создать новый груз и, если его отвлекли, он может сохранить его и вернуться к нему, не имея набора обязательных полей.
Когда я использую CollectionViewSource, я заполняю его ObservableCollection моих сущностей, а затем добавляю сущности в эту наблюдаемую коллекцию, когда создаю их. ObservableCollection реализует события INotifyPropertyChanged и INotifyCollectionChanged и уведомляет пользовательский интерфейс, когда что-то происходит, и все это работает через CollectionViewSource.
Вы можете взглянуть на шаблон MVVM, который действительно хорош для перемещения данных и поддержания его в нужном объеме, и есть несколько хороших сред MVVM, которые помогут вам сделать хорошее приложение с MVVM.
MVVM может быть немного излишним для вашего приложения, если оно маленькое. Но если он преодолеет больше, чем несколько видов, он станет громоздким и трудным для перемещения данных вперед и назад и поддержания их актуальности и удобства обслуживания.
Статья Wiki для MVVM - довольно хорошее место для начала и получения ссылок
Это мой конструктор для одной из моих моделей представления. Я понимаю, что вы не хотите внедрять в MVVM прямо сейчас, но код будет похожим. В этом случае я использую фонового работника для получения моих записей сущностей (вызов конструктора для этого и настройки View сразу же можно игнорировать), затем я связываю свой CVS, заполняю его с помощью ObservableCollection и устанавливаю его Просмотр поля, чтобы я мог отфильтровать его позже.
Public Sub New(ByRef MyView As NTMsView)
Me.New(ViewManagerService.CreateInstance, ViewModelUIService.CreateInstance)
NTMsBackgroundWorker.RunWorkerAsync()
_View = MyView
_NTMCollectionViewSource = _View.FindResource("NTMCollectionViewSource")
_NTMCollectionViewSource.Source = NTMs
_NTMCollectionView = _NTMCollectionViewSource.View
End Sub
Это пример моего метода AddRecord. Затем я создаю экземпляр нового объекта, добавляю его в соответствующую коллекцию в контексте, сохраняю, выполняю хранимую процедуру, а затем обновляю контекст, поскольку хранимая процедура сделала несколько вещей с записью. Затем я добавляю объект в Observable.
Private Sub AddNTM()
'Create an NTM Object.
Dim NewNTM As New NTMShipment()
'Add it to the context
_context.AddToNTMShipments(NewNTM)
_context.SaveChanges()
_context.MakeNewSecurityID(NewNTM.NTMShipID)
_context.Refresh(RefreshMode.StoreWins, NewNTM)
'Wrap it in a ViewModel and Add it to the NTMs collection
NTMs.Add(New NTMViewModel(NewNTM))
End Sub
Что касается создания новой сущности до создания вашего CollectionViewSource, пара вопросов. Связан ли ваш текст редактирования форм с CVS? В моих формах CVS используется только в сочетании с ItemsControls, поскольку он отображает коллекцию элементов. Если ваши элементы управления формами редактирования отделены от CVS, у вас не должно возникнуть особых проблем с заполнением их новой сущностью, и когда придет время сохранять, проверьте, является ли CVS нулевым, и если это так, создайте его, а затем заполните его.
Если это не очень хороший ответ, не могли бы вы рассказать, как структурировано ваше приложение?