Не удается захватить datagrid collectionviewsource вставить/удалить строку
I am looking for solution to the issue of insert new or delete of a datagrid row that is not being identified or captured by simply checking dbcontext.changetracker.haschanges status. HasChanges picks up when user modifies existing datagrid row but (as I have read) insert and delete on a datagrids itemssource that is set using a collectionviewsource as in my case is not recognized by HasChanges. The numerous discussions on internet of this have so far not led me to the solution which must be a commmon one if this design is itself common. The reason for this is me and my lack of knowledge (this is my first WPF, MVVM EF app), so I would like to get a working example to review and learn from.
Я привожу список элементов из базы данных, которые используются для заполнения combobox itemssource. Пользователь может захотеть добавить, удалить или изменить этот список, чтобы у меня было другое представление, из которого он может поддерживать этот список. Я могу иметь дело с действием modify, потому что оно автоматически распознается, когда я использую HasChanges, но я теряюсь в том, как определить, что произошла вставка или удаление строки. Если я могу понять, как определить или "захватить", когда это произошло, то я думаю, что знаю, как добавить/удалить это из своего класса, а затем сохранить его в базе данных.
Что я уже пробовал:
Я перепробовал всевозможные варианты привязки, xaml-дизайн datagrid и связанных с ним столбцов, читал о messenger и сервисах. Похоже, что чем больше я просматриваю интернет, тем сложнее он выглядит.
Один из моих датагридов выглядит следующим образом;
<pre> <DataGrid x:Name="siteDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" Grid.Column="0" Grid.Row="3" ItemsSource="{Binding GeneralSitesViewSource, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="10,10,10,1" RowDetailsVisibilityMode="VisibleWhenSelected" CellStyle="{StaticResource datagridcellstyle}" Height="110" Width="330"> <DataGrid.Columns> <DataGridTextColumn x:Name="Site1Column" Binding="{Binding Site1}" Header="Site Name" Width="310"/> </DataGrid.Columns> </DataGrid>
Datagrid ItemsSource создается следующим образом;
private void FillGeneralSites() { var q = (from a in Generalcontext.Sites select a).ToList(); _generalSites = new ObservableCollection<Site>(q); GeneralSitesViewSource = CollectionViewSource.GetDefaultView(_generalSites); GeneralSitesViewSource.SortDescriptions.Add(new SortDescription("Site1", ListSortDirection.Ascending)); } public ICollectionView GeneralSitesViewSource { get; set; } private ObservableCollection<Site> _generalSites; public ObservableCollection<Site> GeneralSites { get { return _generalSites; } set { _generalSites = value; OnPropertyChanged("GeneralSites"); } }
В настоящее время установите проверку только с помощью HasChanges и если есть какие либо изменения в этом случае сохраните
public bool CanClose() { //check if saved context then return true or false etc if (Generalcontext.ChangeTracker.HasChanges()) { MessageBoxResult msgresult = MessageBox.Show("Changes were not saved. Do you want to save your changes before exiting?", "EXIT WINDOW", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning); if (msgresult == MessageBoxResult.Yes) { Generalcontext.SaveChanges(); return true; } else if (msgresult == MessageBoxResult.No) { return true; } else { return false; } } else { return true; } }