2017-10-28 182 views
0

我有一個綁定到的ObservableCollection這是在我的NinjaList視圖模型WPF MVVM - DataGrid不更新更改回數據庫

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

在哪裏忍者定義方法的WPF的DataGrid

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> 

的觀點並示出了T的所有內容他將忍者表放入網格中。此外,在進行更改時,它們會在應用程序運行期間持續存在。但更改不會保存到數據庫中。我的理解是,如果您使用Mode = TwoWay綁定到ObservableCollection這樣的ObservableCollection,它應該自動將更改更新回數據庫。但顯然我錯過了一些東西,有人可能會指出我做錯了什麼?

我使用MvvM Light作爲MvvM框架。

回答

0

是的,原因是你的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(); 
      } 
     } 
    } 
+0

也許會讓人們說:「Strahbehry可以請你不要使用上的答案評論申報你永遠永恆的愛一個人」這麼多,但由於我一直被困在這個多天,並且正朝着最後期限前進。這有效,你很棒。 –

+0

作爲跟進,如果我現在刪除一行應用程序崩潰。你有什麼想法,爲什麼?它之前沒有。 –

+0

哪個例外出現?我認爲你第一種方法拋出異常,因爲他們找不到該行。 – Lukas