Похоже где-то в моей ДНК закралась ошибка, но уже пару дней бъюсь головой об проблему: при выполнении операции добавления и удаления элемента в Table<>, связаные с ним контролы не отображают новый элемент и не удаляют удалённый. При этом обновление содержимого работает нормально, а запросы insert/delete уходят в базу. То есть результат insert/update виден только при следующем запуске программы (SubmitChanges не помогает)
Теперь подробнее. Дано
Таблица в MSSQL2005:
CREATE TABLE [Symptoms](
[id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [dbo].[Title] NOT NULL,
[Description] [dbo].[Description] NULL,
[Media] [int] NULL,
[MainPart] [int] NOT NULL
)
UDT Title и Description это nvarchar и ntext
Для этой таблицы в O/R Designer сделан Entity класс (посредством перетаксивания из Server Explorer), который я не менял
Для всего приложения создаётся экземпляр полученого O/R датаконтекста:
if(DataContext_==null) {
DataContext_=new DataDataContext();
DataContext_.ObjectTrackingEnabled=true;
DataContext_.DeferredLoadingEnabled=true;
}
В xaml выполняется привязка к ListBox:
<CollectionViewSource x:Key="SymptomsDataView" Source="{Binding Source={x:Static Application.Current}, Path=DataContext.Symptoms}" />
......
<ListBox DataContext="{Binding Source={StaticResource SymptomsDataView}} Name="SymptomsList" DisplayMemberPath="Name" ItemsSource="{Binding Path=.,Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" />
На той же форме есть кнопка добавить запись с привязаным событием вида:
Symptom s=new Symptom();
s.Name="Новый симптом";
s.AnatomicPart=((App)App.Current).DataContext.AnatomicParts.First();
((App)App.Current).DataContext.Symptoms.InsertOnSubmit(s);
((App)App.Current).DataContext.SubmitChanges();
Если всё это запустить, то в литсбоксе появятся элементы из БД, их даже можно будет поменять посредством detail — части представления, но нажатие на кнопку добавить приводит к тому что в БД запись вставляется, однако её не видно в листбоксе. Тоже самое при операции удаления.
Table<TEntity> не реализует INotifyCollectionChanged, соответственно и GUIни нет возможности узнать об изменениях в коллекции. Оберните Table в ObservableCollection и подсуньте ее CollectionViewSource.
Здравствуйте, andr3ya, Вы писали:
A>Похоже где-то в моей ДНК закралась ошибка, но уже пару дней бъюсь головой об проблему: при выполнении операции добавления и удаления элемента в Table<>, связаные с ним контролы не отображают новый элемент и не удаляют удалённый. При этом обновление содержимого работает нормально, а запросы insert/delete уходят в базу. То есть результат insert/update виден только при следующем запуске программы (SubmitChanges не помогает)
A>Теперь подробнее. Дано
A>Таблица в MSSQL2005:
A>A>CREATE TABLE [Symptoms](
A> [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
A> [Name] [dbo].[Title] NOT NULL,
A> [Description] [dbo].[Description] NULL,
A> [Media] [int] NULL,
A> [MainPart] [int] NOT NULL
A>)
A>
A>UDT Title и Description это nvarchar и ntext
A>Для этой таблицы в O/R Designer сделан Entity класс (посредством перетаксивания из Server Explorer), который я не менял
A>Для всего приложения создаётся экземпляр полученого O/R датаконтекста:
A>A>if(DataContext_==null) {
A> DataContext_=new DataDataContext();
A> DataContext_.ObjectTrackingEnabled=true;
A> DataContext_.DeferredLoadingEnabled=true;
A>}
A>
A>В xaml выполняется привязка к ListBox:
A>A><CollectionViewSource x:Key="SymptomsDataView" Source="{Binding Source={x:Static Application.Current}, Path=DataContext.Symptoms}" />
A>......
A><ListBox DataContext="{Binding Source={StaticResource SymptomsDataView}} Name="SymptomsList" DisplayMemberPath="Name" ItemsSource="{Binding Path=.,Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" />
A>
A>На той же форме есть кнопка добавить запись с привязаным событием вида:
A>A>Symptom s=new Symptom();
A>s.Name="Новый симптом";
A>s.AnatomicPart=((App)App.Current).DataContext.AnatomicParts.First();
A>((App)App.Current).DataContext.Symptoms.InsertOnSubmit(s);
A>((App)App.Current).DataContext.SubmitChanges();
A>
A>Если всё это запустить, то в литсбоксе появятся элементы из БД, их даже можно будет поменять посредством detail — части представления, но нажатие на кнопку добавить приводит к тому что в БД запись вставляется, однако её не видно в листбоксе. Тоже самое при операции удаления.
BindingSource.Add (s);