2012-04-10 2 views
0

MyContextの自動生成DataContextクラスのタイプのスーパークラスに対して、MyEntityBaseというカスタムベースタイプがあります。モックデータコンテキストを作成しようとすると、私はMyEntityBaseINotifyPropertyChangedを実装することにしました。変更を一般的に追跡できます。ここでカスタムDataContextベースタイプでINotifyPropertyChangedが発生しません

は、私のクラスは次のようになります。このクラスに基づいて

public abstract class MyEntityBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

、私は、エンティティの特定の型のインスタンスを格納するための一般的なRepository<T>クラスを作成しました。このクラスの背後にある基本的な考え方は、datacontextに似たメソッドを提供することですが、代わりにメモリ内のリストを使用します。変更セットはサードパーティシステムとの同期のためのアプリケーションのビジネスロジックにとって重要なものであるため、変更の追跡をシミュレートしたいと考えています。ここで

Repository<T>の基本的なシェル実装されています。今、私はいくつかのデータを取り込み、タイプEmployeeの簡単なリポジトリを作成し、データのプロパティを変更しようと

public class Repository<T> 
    where T : MyEntityBase, INotifyPropertyChanged 
{ 
    protected List<T> _data; 
    public Repository(List<T> data) 
    { 
     this._data = data; 
     foreach (var entity in this._data) 
     { 
      entity.PropertyChanged += new PropertyChangedEventHandler(entity_PropertyChanged); 
     } 
    } 

    protected void entity_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     Console.WriteLine("HERE"); 
    } 
} 

Employeeオブジェクトには、自動生成されたDataContextのプロパティ変更通知ビルトインが含まれているため、PropertyChangedイベントが発生することが予想されます。

var data = new List<Employee> { 
    new Employee { FirstName = "Bob" }, 
    new Employee { FirstName = "Joe" }, 
}; 

var repo = new Repository<Employee>(data); 

// This should fire the PropertyChanged event 
data[0].FirstName = "John"; 

私が間違っているの何を:私は次のコードを実行するときしかし、私はどこにも出力で生成されたHEREが表示されませんか?


更新:私は次のようにイベントをサブスクライブラインを変更した場合:

(entity as Employee).PropertyChanged += ... 

はその後、それが正常に動作します。しかし、TはすでにEmployeeであると知られており、entityEmployeeのインスタンスなので、どういう違いがありますか? MyEntityBaseeventvirtualに設定しても、正しく動作しません。

+1

ここでコードをhttp://dotnetpad.net/ViewPaste/HfGdC7ypCEC4TYZ-Vb7I0Aにコピーしました(そして、Entityに仮想を追加しました)。それはうまくいくようです...おそらく、従業員に何かがありますか? – Patrick

+0

'Employee'は' SQLMetal'を使って自動生成されるので、私は 'Employee'を制御できません。しかし、違いは 'override'キーワードの不足であるように見えますが、それを削除するとテストコードで再び失敗することになります。 – mellamokb

+0

これは、 'override'というキーワードが存在しなくても' Employee'のような継承されたクラスに常に 'PropertyChanged'をオーバーライドさせる方法が必要なようです。そんなことも可能ですか? – mellamokb

答えて

0

私は実行可能な解決策が実装されているので、私は自分の質問に答えます。私はすでにMyDataContext.dbmlファイルの自動生成にいくつかのカスタマイズを行うためのコマンドラインツールFindAndReplaceText.exeを持っているので、末尾にはoverrideを含むように生成されたMyDataContextクラスのすべてのイベントを変更する呼び出しを追加したばかりです。

FindAndReplaceText.exe -c^
    MyDataContext.cs^
    "public event"^
    "public override event" 

今すぐプロパティの変更は、私のテストコードに適切に通知:イベントの定義に私の基本クラス利用 virtualを行うことと相まって、これは問題を解決します。

関連する問題