2011-07-18 14 views
1

私はWPVMデスクトップアプリケーション用のMVVMを実装したプロジェクトに取り組んでいます。私はDatagridを古いMS Accessのテーブルリストビューのように編集できるようにしたいという状況があります。私は、メンバーがINPCを実装しているObservableCollectionにDatagridのItemsSourceをバインドしています。今度は、列の任意のセルをクリックしてメンバーを更新できるようにしたいのですが、他の行に移動したりフォーカスを失ったりすると、データを検証してDBに保存する必要があります。WPF編集可能なDataGrid for MS AccessとMVVM

ViewModelでこのようなイベントをキャプチャする方法と、この単純な機能をどのように達成できますか?

答えて

0

グリッドのSelectedItemをビューモデルのプロパティにバインドし、以前に選択したアイテムを保存することができるプロパティのセッターで、新しく選択したアイテムをそれが変更された項目を保存するのに著しく時間がかかる場合、あなたは何をしたいだろう - あなたはややこのアプローチを調整する必要があるかもしれません。もちろん、

public MyDataObject SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     if (value != _selectedItem) 
     { 
      SaveMyItem(_selectedItem); 
      _selectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 
} 

private MyDataObject _selectedItem; 
<DataGrid ItemsSource="{Binding MyCollection}" SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" ...etc... /> 

:簡単な擬似コードは、それは次のようになりますそれはバックグラウンドスレッド上のものです。グリッドの列バインディングの一部として検証を指定すると、データが正しく検証されるまで、ユーザーは新しい行を選択して編集することができなくなります。

+0

これはうまくいくはずです。バックグラウンドスレッドに保存する必要があります。btwパターン指向のアプローチを探していて、IEditableCollectionViewを使用しています:http:///blogs.msdn.com/b/vinsibal/archive/2008/05/20/wpf-3-5-sp1-feature-ieditablecollectionview.aspx。このアプローチについてどう思いますか? –

+0

私は自分のDTO上でIEditObjectを使ってみましたが、それは魅力的です。しかし、私は背景のスレッドにオブジェクトを保存する必要があります。私が知りたかったあなたのアプローチについての一つのことは、ユーザーが行を選択し、別の行を選択せず​​に単純にページからナビゲートする場合です。それは選択された財産の設定者を呼びますか? –

+0

@Shoaib - はい、SelectedItemバインディングに 'UpdateSourceTrigger = PropertyChanged'を含める限り、セッターは新しい行を選択する瞬間に呼び出されます。 – slugster

0

私はLinqをSqlにし、データグリッドのItemsSourceを直接あなたが望むテーブルにバインドします。これはあなたのすべての変更追跡を処理し、SubmitChangesを呼び出すだけでデータベースに保存されます(これは、selectedItemが変更されたときにいつでも実行でき、slugsterの答えを参照してください)。

+0

LinqToSQLとうまくいくはずですが、DALとして既にLLBLGen proを使用しているので、linqをSQLに使用することはできません。 LLBLGenエンティティをビューに渡すことはできません。レイヤを密接に連結するためです。私はPOCOで動作するいくつかの方法が欲しい。 –

関連する問題