[英]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.