c#WPF MvvM应用程序DataGrid未更新到数据库

c#WPF MvvM应用程序DataGrid未更新到数据库,c#,wpf,mvvm,data-binding,datagrid,C#,Wpf,Mvvm,Data Binding,Datagrid,我正在使用MvvM Light开发WPF应用程序。我已经为我的DataGrid创建了一个数据绑定,当我在那里编辑一些东西时,它不会更新到数据库,我不确定哪里出错了 这是我的视图代码: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http

我正在使用MvvM Light开发WPF应用程序。我已经为我的DataGrid创建了一个数据绑定,当我在那里编辑一些东西时,它不会更新到数据库,我不确定哪里出错了

这是我的视图代码:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:NinjaApp_V2.Views"
    xmlns:ViewModel="clr-namespace:NinjaApp_V2.ViewModel" xmlns:NinjaApp_V2="clr-namespace:NinjaApp_V2" x:Name="NinjaCRUDWindow" x:Class="NinjaApp_V2.Views.NinjaCRUD"
    mc:Ignorable="d"
    Title="NinjaCRUD" Height="300" Width="300">
<Window.Resources>
    <CollectionViewSource x:Key="ninjaViewSource" d:DesignSource="{d:DesignInstance {x:Type NinjaApp_V2:ninja}, CreateList=True}"/>
</Window.Resources>
<Window.DataContext>
    <Binding Path="AddNinja" Source="{StaticResource Locator}"/>
</Window.DataContext>
<Grid DataContext="{Binding Source={StaticResource Locator}}" Margin="0,10,3.6,0.4">
    <DataGrid x:Name="DataGridNinjas" ItemsSource="{Binding Ninjas.Ninjas}">
        <DataGrid.ItemBindingGroup>
            <BindingGroup/>
        </DataGrid.ItemBindingGroup>
    </DataGrid>
    <Button Command="{Binding SaveCommand}" CommandParameter="{Binding ElementName=AddWindow}" Margin="0,180,211,0">Save</Button>
</Grid>

拯救

正如我在多个示例中看到的那样,该视图的.cs完全是空的

AddNinjaVM包含SaveCommand,如下所示:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using NinjaApp_V2.Views;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace NinjaApp_V2.ViewModel
{
    public class AddNinjaVM : ViewModelBase
    {
        public NinjaVM Ninja { get; set; }

        public ICommand SaveCommand { get; set; }

        private NinjaListVM _ninjas;

        public AddNinjaVM(NinjaListVM ninjas)
        {
            _ninjas = ninjas;
            Ninja = new NinjaVM();
            SaveCommand = new RelayCommand<NinjaCRUD>(Save);
        }

        private void Save(NinjaCRUD obj)
        {
            using (var context = new NinjaApp_DatabaseEntities())
            {
                context.SaveChanges();
            }

            _ninjas.Ninjas.Add(Ninja);
            obj.Hide();
        }
    }
}
使用GalaSoft.MvvmLight;
使用GalaSoft.MvvmLight.Command;
使用NinjaApp_V2.Views;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Input;
名称空间NinjaApp_V2.ViewModel
{
公共类AddNinjaVM:ViewModelBase
{
公共忍者忍者{get;set;}
公共ICommand SaveCommand{get;set;}
私人忍者;
公共地址Ninjavm(NinjaListVM ninjas)
{
_忍者=忍者;
忍者=新忍者();
SaveCommand=新的RelayCommand(保存);
}
私人无效保存(NinjaCRUD obj)
{
使用(var context=new NinjaApp_DatabaseEntities())
{
SaveChanges();
}
_忍者。忍者。添加(忍者);
隐藏对象();
}
}
}

为此,我遵循了学校的一个工作示例。这是我第二天一直坚持的一部分,我不明白为什么它在我的应用程序中不起作用。也许有人能帮我一下吗?

对不起,我不太确定那会怎样。我一直在NinjaCRUD上出错,它想要一个对象而不是一个类型:)当我写的时候——我的意思是。。实体框架上下文中的实际表/实体名称。和实体类型的实际对象。键入上下文。你会看到一个自动建议(intellisense)弹出窗口,滚动该列表以找到表/实体。是的,我实际做的第一件事是用context.ninjas替换DBtable,因为它是关于这个表的,但它给出了预期的错误标识符。当我把它改为context.ninjas.Add(obj);我得到``无法从NinjaApp_V2.Views.NinjaCRUD转换为NinjaApp_V2.ninja-而且我没有复制任何作品,该示例只是整个项目范围的一小部分。但是在应用程序的多个地方,我们必须使用数据网格来显示和更新信息。在添加忍者之前,您正在保存上下文更改。难道不是相反吗?(您的上下文必须在保存之前跟踪更改,并且使用此代码,您的上下文的保存时间仅足以保存它,但不能在其中添加或更新任何实体)感谢您的建议。交换了它,但没有任何区别-非常感谢你试图帮助tho!没问题。也可能是WPF绑定问题(众所周知,它们很难处理和调试)。在EF保存VM中的对象之前,单击命令以验证该对象是否具有正确的值时,您是否仔细阅读了代码?这将告诉您问题是在WPF端还是在EF/DB端。datagrid确实显示了数据库中的数据,因此我们使用它来验证EF是否实际正常工作,只是回写数据库或刷新datagrid中的数据不起作用。如果我在应用程序打开时更新数据库,按“保存”按钮不会将新更改加载到datagrid中。是的,但这是一条双向的道路-单向绑定往往更容易设置,因此很好,这样的结果很好,但是,您可能希望在调试模式下一步一步地检查代码,以缩小问题所在的范围。调试是一门艺术:第一件事是尽可能缩小范围,以确定事情从好到坏的发展方向。可能在WPF绑定中,可能在DB中,可能在实体映射中,等等。请记住,双向绑定并不意味着如果设置了读取端,那么写入端也会自动被设置
 private void Save(NinjaCRUD obj)
        {
            using (var context = new NinjaApp_DatabaseEntities())
            {
                **context.<DBtable>.Add(obj);**
                context.SaveChanges(); <---- This is where it is wrong.
            }

            _ninjas.Ninjas.Add(Ninja);  
            obj.Hide();
        }
  //create DBContext object
        using (var dbCtx = new SchoolDBEntities())
        {
            //Add Student object into Students DBset
            dbCtx.Students.Add(newStudent);

            // call SaveChanges method to save student into database
            dbCtx.SaveChanges();
        }