2012-01-17 7 views
0

WPFでMVVMパターンを試していて、WCFデータサービスを使用してデータベース(つまり顧客のリスト)からレコードを取得しました。ビューモデルからは、すべての顧客を取得する特定のサービスを呼び出しています。ビューからオブジェクトの変更を行うときに、変更を追跡する方法はありますか? EntityStateのようなもの。ビューモデルからのエンティティの変更の追跡

助けてください!

+0

これは役に立ちます - http://stackoverflow.com/questions/6332802/how-to-track-entity-changes-with-wcf-ria-services – davidsleeps

答えて

0

ViewModelデータオブジェクトにINotifyPropertyChangedが継承されている場合は、変更が加えられたことを示すブール値プロパティを設定できます。

1

エンティティに対して独自の変更追跡動作を実装できます。私は、変更を追跡する必要がある複数のエンティティを持っています。変更トラッキングのコア機能を実装するための共通のベースクラスを使用するようアドバイスします。

エンティティのフレームワークを使用するセルフトラッキングエンティティもオプションです。 STEとpoco(Plain Old Clr Objects)エンティティの使用については、すでに多数の記事があります。ここを参照してください:

Introduction to ADO.NET Entity Framework

STE's vs Poco entities

STE's vs Poco

0

は、あなたが顧客のリストである '顧客' という名前のプロパティで、ViewModelにクラスを持っていると言います。 3つの事を変更することができます。

  1. をあなたのビューモデルにおける顧客プロパティ(つまり、あなたがして、リスト全体を変更します。=新しいリストthis.customers
  2. をあなたがするか、リストから項目を追加または削除
  3. 。あなたが正しいイベントを発生提供メカニズムは、すべてのケースを扱うことができるバインディング

WPFに依存;

  • すでにリスト内の特定の顧客の特性の変化(例えば、顧客[0] .address =「XXX」。シナリオが発生する可能性があります。

    あなたの顧客のコレクションは変更できないと言って簡単に回避してください。つまり、ViewModelの構築中に顧客のリストを割り当て、このプロパティを置き換えません。

    #2の場合、ObservableCollectionという名前の.NETオブジェクトを再利用することをお勧めします。このコレクションはINotifyPropertyChangedを実装し、追加、削除、クリアなどの呼び出し時に正しい引数で正しい通知を発行します。

    #3では、Customerオブジェクトに対してINotifyPropertyChangedを実装する必要があります。たとえば:

    public class Customer : INotifyPropertyChanged 
    { 
        public PropertyChangedEventHandler PropertyChanged; 
    
        private string _name; 
        public string name { 
         get { return _name; } 
         set { _name = value; ... /* add code to fire exception */ } 
        } 
    
        ... // more properties 
    } 
    

    は今、あなたのビューモデルでは、UIで監視可能なコレクション

    public class ViewModel 
    { 
        public ObservableCollection<Customer> customers { get; private set; } 
    
        ViewModel() { 
         // Allocate it once during construction 
         customers = new Observablecollection<Customer>() 
        } 
    } 
    

    を持って、あなただけのバインドする必要があります。どんなItemsControlを使用していても:

    <ItemsControl DataSource="{Binding customers}"> 
        <!-- The template to display the items here --> 
    </ItemControl> 
    

    これで、顧客コレクションとサーバー上のコレクションを同期させておく必要があります。顧客に行った変更はすべてUIに反映されます。

  • 関連する問題