簡體   English   中英

WPF MVVM-DataGrid不會將更改更新回數據庫

[英]WPF MVVM - DataGrid does not update changes back to database

我有一個WPF DataGrid,它綁定到NinjaList ViewModel中的ObservableCollection

public ObservableCollection<NinjaVM> Ninjas { get; set; }

以及定義忍者的方法

public NinjaListVM()
        {
            using (var context = new NinjaApp_DatabaseEntities())
            {
                var ninjas = context.ninjas.ToList();
                Ninjas = new ObservableCollection<NinjaVM>(ninjas.Select(r => new NinjaVM(r)));
            }
        }

我的視圖中的代碼如下

<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"
        DataContext="{Binding Ninjas, Source={StaticResource Locator}}" Loaded="onLoad">


    <Grid Margin="0,10,3.6,0.4">
        <DataGrid x:Name="DataGridNinjas" ItemsSource="{Binding Ninjas, Mode=TwoWay}" SelectedValue="{Binding Ninjas, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="True">
        </DataGrid>
        <Button x:Name="btnNewNinja" Command="{Binding ShowNewNinja}"  Margin="10,228,103.4,-0.4" Content="New Ninja"/>
    </Grid>
</Window>

該視圖確實將“忍者”表的所有內容顯示到網格中。 同樣,進行更改后,它們會在應用程序運行的整個過程中持續存在。 但是更改未保存到數據庫中。 我的理解是,如果使用Mode = TwoWay這樣綁定到ObservableCollection,它將自動將更改更新回數據庫。 但是顯然我缺少了什么,有人可以指出我做錯了嗎?

我正在使用MvvM Light作為MvvM框架。

是的,原因是您的Viewmodels無法直接訪問數據庫。

        //opening the database
        using (var context = new NinjaApp_DatabaseEntities()) 
        {
           //query the database and store the result in memory
            var ninjas = context.ninjas.ToList();

           //Viewmodel mapping
            Ninjas = new ObservableCollection<NinjaVM>(ninjas.Select(r => new NinjaVM(r)));
        } // in the end of the using statement the database will be "closed"

操作忍者不會影響數據庫。

我懷疑您正在使用實體框架。

因此,如果要存儲更改,則必須重新打開數據庫,搜索特定的忍者並覆蓋該屬性,然后使用SaveChanges Methode。

為了練習,您可以在二傳手中進行

    public class NinjaVM
{

    private int _id;

    private string _name;
    public string Name
    {
        get { return _name; }
        set
        { 
            using (var context = new NinjaApp_DatabaseEntities())
            {
                var ninja = context.ninjas.FirstOrDefault(n => n.Id == _id  ));
                if(ninja == null)
                return;
                ninja.Name = value;
                context.SaveChanges();
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM