2016-11-16 12 views
3

ビューモデルのプロパティにバインドされた多数の入力フィールドを持つWPFダイアログを検討してください。例えば。バインドされたプロパティのWPFボイラープレートコードの最小化

... 
<TextBox Text="{Binding FirstName}"> 
... 

public string FirstName { 
    get { return mFirstName; } 
    set { 
    if (mFirstName == value) return; 
    mFirstName = value; 
    OnPropertyChanged("FirstName"); 
    } 
} 

このように数十のフィールドがあるので、書きたい定型C#コードを最小限に抑えたいと思います。どのようなオプションがありますか?

+0

名前を渡す必要はありません。void OnPropertyChanged([CallerMemberName] String propertyName = null)を使用してください。今度は、属性を持つ定型文の残りの部分を解決するフレームワークがありますが、それまでに私はそれを調べました。別のオプションは、任意の値(CallerMemberNameトリックも含む)を取得/設定してイベントを発生させる汎用コードを持つDictionary ラッパーのようなものです。次に、例えば 'get {return props.Get ()}'と 'set {props.Set(value);}を持っています。 } ' – stijn

+0

Resharperのような適切なツールを使用して、定型コードを生成することもできます(または少なくとも簡単にすることができます)。 – Evk

答えて

0

コードをスニペットに変換するのが少し楽になります。

if (mFirstName != value) { 
    mFirstName = value; 
    OnPropertyChanged("FirstName"); 
} 

書き込みにかかる時間が苦痛で、WPFを多く使用している場合は、スニペットを使用することもできます。私は崇高なテキスト、VSコード、およびVisual Studioで知っている、スニペットは非常に貴重なことができます。それ以外の場合は、私が見ていないものを除いて、あなたが得ることのできる裸の骨だと思います

0

最初に、Microsoft.Prismを既に使用していると思いますが、文字列と利益はCallerMemberNameAttribute 、あなたのコードは次のようになりますように:

public string FirstName { 
    get { return mFirstName; } 
    set { 
    if (mFirstName == value) return; 
    mFirstName = value; 
    OnPropertyChanged(); 
    } 
} 

また、これは、C#6.0 nameof(FirstName)オペレータに相当します。

第2に、AOPを掘り下げて、ボイラープレートを属性に抽象化することができます。この扱っAOPフレームワークの一つはPostSharpであり、それはあなたのコードは次のようになります使用:それは無料ではない、とAOP has it's drawbacks(感謝EVK)ものの

[NotifyPropertyChanged] 
public class Customer 
{ 
    public string FirstName { get; set; } 

類似の質問がありました12、それは誰もが痛むので、今は悲しいことに最適な答えがないようです。

+0

AOPツール(少なくとも.NETで)は通常リフレクションを使用しません - アセンブリILコードを直接書き換えます(実際にはメソッド\クラスを変更するなど)。 – Evk

0

私はFodyを使用して、コンパイル時にプロパティ変更されたコードを注入します。あなたのクラスは[ImplementPropertyChanged]属性を取得し、次に{get;セット; }プロパティは、コンパイルされたコードのプロパティを通知するようになります。定型が大幅に削減されていることを示す、

public abstract class BindableBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 
    { 
     if (Equals(storage, value)) 
     { 
      return false; 
     } 

     storage = value; 

     // ReSharper disable once ExplicitCallerInfoArgument 
     OnPropertyChanged(propertyName); 
     return true; 
    } 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    protected void OnPropertiesChanged(params string[] propertyNames) 
    { 
     foreach (string propertyName in propertyNames) 
     { 
      // ReSharper disable once ExplicitCallerInfoArgument 
      OnPropertyChanged(propertyName); 
     } 
    } 
} 

使用例:あなたは、基本クラスを使用するオプションを持っている場合

https://github.com/Fody/PropertyChanged

0

は、このようなものから、ビューモデルオブジェクトを継承考える

public sealed class ViewModel : BindableBase 
{ 
    private string name; 

    public string Name 
    { 
     get { return name; } 
     private set { SetProperty(ref name, value); } 
    } 
} 

(基本クラスを使用できない場合(たとえば、既にフレームワーク要素を所有している、またはフレームワーク要素にプロパティを使用している場合など)は、

関連する問題