2011-06-20 13 views
5

私は周りを探索してきましたが、私が探しているものを見つけることができないので、ここに行きます。C#WPFプロパティセッターメソッドを動的に設定する方法は?

状況: 私はクラスMainWindowとMainWindowDataを持っています。 MainWindowDataには、属性UpdateGUIで定義されたパブリックプロパティのみがあります。

public class UpdateGUI : Attribute { } 

public class MainWindowData 
{ 
    [UpdateGUI] 
    public string TESTVAR { get; set; } 
} 

ここで、MainWindowDataの各プロパティのセッターメソッドにメソッドを追加します。より具体的に:

void OnPropertyChanged(String PropertyName); 

私は、メイン・ウィンドウコンストラクタ内のすべてのUpdateGUIのプロパティを取得し、その後、何とかそれに別の方法を追加し、私はこだわっているところ、これがあるはずと考えました。 は私が働くすべてのプロパティを、取得するためにこのコードを使用します。

List<PropertyInfo> properties = (from pi in typeof(MainWindowData).GetProperties() 
           where pi.GetCustomAttributes(typeof(UpdateGUI), false).Any() 
           select pi).ToList(); 

これは私が更新する必要があり、すべてのプロパティの素敵なリストを提供します。

そこで質問です:どのように私はそれを行うことができますプロパティを動的に変換されますよう:に

[UpdateGUI] 
private string _TESTVAR; 
public string TESTVAR { 
    get { 
     return _TESTVAR; 
    } 
    set { 
     _TESTVAR = value; 
     OnPropertyChanged("TESTVAR"); 
    } 
} 

任意の助けをありがとう!それは非常に理解されるであろう:)

ご挨拶あなたはアスペクト指向プログラミング(AOP)の概念に解決されている探しているものを

+0

+1興味深い質問が、これから出てくるものを見てうれしいです。 –

答えて

5

を。

一つの例は、あなたがこのようなあなたのデータ/のviewmodelクラスを記述することができますin PostSharp、(また、see details here)です:

[NotifyPropertyChanged] 
public class Shape 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

public class Rectangle : Shape 
{ 
    public double Width { get; set; } 
    public double Height { get; set; } 
} 

あなたはPostSharpが気に入らない場合、私は他のAOPはアウトフレームワークと確信しています同様の機能があります。

EDIT

私は完全なAOPフレームワークを必要とせずに、あなたのためにこれを行いNotifyPropertyWeaverを見つけました。

コンパイル時にMono.Cecilを使用して通知コードを挿入し、NuGet(これは私が行ったことです)またはプロジェクトWebサイトからインストール可能です。

デフォルトでは、それも(それが自動的にプロパティとクラスが通知を変更する必要が出て数字)、属性を必要としませんが、あなたはそうのように、また、明示的に指定できます。私が見つけ

[NotifyProperty] 
public int FooBar { get; set; } 

一つの便利な機能プロパティ間の依存関係を宣言する可能性がありました。この場合、FooBarが変更されるたびにRaisePropertyChanged("FoobarTimesTwo")が呼び出されます。あなたは、アセンブリを取る、それはコードです修正し

戻ってそれを保存することができ、そのツールで

Mono.Cecil

:PostSharpのようなAOPフレームワークに加えて

[DependsOn("FooBar")] 
public int FoobarTimesTwo 
{ 
    get { return FooBar * 2; } 
} 
+0

+1興味深い作品。詳細へのリンクは、彼/彼女自身をしたい場合にコーディングのアイデアを提供します。 –

+0

クイック返信ありがとうございます、それはまさに私が必要なものです。残念ながら、それは自由に使用することはできませんが、おそらく私はそれを把握するか、他のAOPフレームワークを見つけることができます。 – FrieK

0

オープンソースフレームワークImpromptuInterface.MVVMは、C#4.0の動的機能を使用して、変更されたプロパティをサポートする自動プロパティを追加します。 ImpromptuViewModelはExpandoObjectのように機能するだけでなく、MVVMを支援するその他の機能も備えています。

関連する問題