2017-10-28 17 views
0

に私は私のNinjaListのViewModelWPF MVVM - DataGridの変更を更新しないバックデータベース

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

そして忍者が定義されている方法であるのObservableCollectionにバインドされているWPFのデータグリッドを持って

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

私のビュー内のコードは、tのすべての内容を示してい

<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> 

ビューを踏襲しているよう彼はグリッドに忍者テーブル。また、変更が加えられると、アプリケーションが実行されている間中存続します。しかし、変更はデータベースに保存されていません。 ObservableCollectionにこのようにバインドすると、Mode = TwoWayを使用して自動的に変更をデータベースに更新する必要があることを理解しています。しかし明らかに私は何かが欠けている、誰かがおそらく私が間違っていることを指摘することができますか?

私はMvvMフレームワークとしてMvvM Lightを使用しています。

答えて

0

ええ、理由はあなたのViewModelがデータベースに直接アクセスできないためです。

 //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メソッドを使用する必要があります。

あなたはおそらく、人々は「Strahbehryあなたは永遠に人のために永遠の愛をあなたを宣言するの答えにコメントを使用しないでくださいすることができ、」しかし、本当にありがとうございましたと言って取得するつもりセッター

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

でこれを行うことができます練習のために私はこれを複数日にわたって執着しており、締め切りに向かって走っていました。これはうまくいきます。フォローアップとして –

+0

、行を削除すると、アプリケーションがクラッシュします。理由は何ですか?以前はなかった。 –

+0

例外が表示されますか?私は最初のメソッドは、行を見つけることができないため、例外をスローすると思います。 – Lukas

関連する問題