无法从我的WPF DataGrid插入或删除

时间:2011-11-10 02:30:55

标签: wpf

我有一个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();
    }

2 个答案:

答案 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时,一切都很完美(但我无法排序:()