我有一个WPF DataGrid,我希望能够更新,插入和删除。我使用ObservableCollection绑定到DataGrid.DataContext。
当DataGrid的SelectionChanged()事件触发时,我执行Context.SaveChanges()以写回数据库。
但是,上述内容仅在我更新现有记录时有效。当我尝试通过单击DG中的最后一行或按下删除来添加新记录时,SaveChanges()不执行任何操作。不会添加或删除数据。
如何在DataGrid中添加或删除记录?这是我的DG xaml:
<DataGrid AutoGenerateColumns="False" Margin="0,12,0,89" Name="grdContact"
CanUserAddRows="True" SelectionMode="Single" IsReadOnly="False" CanUserDeleteRows="True"
ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True"
Focusable="True"
SelectionChanged="grdContact_SelectionChanged"
<DataGrid.Columns>
<DataGridTextColumn Header="Last Name" Width="150" Binding="{Binding LastName}"/>
<DataGridTextColumn Header="First Name" Width="150" Binding="{Binding FirstName}"/>
</DataGrid.Columns>
</DataGrid>
我的代码背后 - 伪代码:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var CustomerObj = new ObservableCollection<Contact>(GetContacts());
grdContact.DataContext = CustomerObj;
}
private void grdContact_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Context.SaveChanges();
}
答案 0 :(得分:1)
这是因为ObservableCollection<T>
没有通知添加或删除项目的上下文。实际上,它对您的数据库上下文一无所知!
您必须连接CustomerObj
集合以添加或删除上下文中的对象:
CustomerObj.CollectionChanged += CustomerObj_CollectionChanged;
...
private void CustomerObj_CollectionChanged(object sender,
NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (var item in e.NewItems.Cast<Contact>())
Context.AddObject(item);
break;
case NotifyCollectionChangedAction.Remove:
foreach (var item in e.OldItems.Cast<Contact>())
Context.DeleteObject(item);
break;
// handle Replace, Move, Reset
}
Context.SaveChanges();
}
答案 1 :(得分:0)
我有类似的问题。 当getContacts()返回List时,我只能更新(不插入或删除)。 但是当getContects返回IQueryable时,一切都很完美(但我无法排序:()