2016-07-22 9 views
2

新しい繰り返しのコードをOnPropertyChangedを、これはユーザーの変更を処理するための一般的な方法のようだ:WPF WFP(MVVM)へ

private bool someProperty= false; 
    public bool SomeProperty 
    { 
     get { return someProperty; } 
     set 
     { 
      if (someProperty!= value) 
      { 
       someProperty= value; 
       OnPropertyChanged(nameof(SomeProperty)); 


      } 
     } 
    } 

編集を必要とする分野の多くの大きくて複雑な画面の場合、および取り扱いすぐに(ボタンをクリックしたときの最後ではありません)、これは一連の繰り返しコードを生成します。あなたが50以上のプロパティを持っている場合はどうすれば維持するのが本当に難しいですか?それを行うより良い方法はありますか?

答えて

0

PropertyChanged.Fodyここでは、コンパイル時にINotifyPropertyChangedコードをプロパティに挿入し、他のより巧妙なものを使用します。

+0

がうまく見えます。特定のプロパティのカスタムアイテムを追加するにはどうすればよいですか? OnPropertyChanged()の他に、他の特定のコードを実行したいという意味です。 –

+0

私自身の答えはここにあると思う:https://github.com/Fody/PropertyChanged/wiki/On_PropertyName_Changed –

0

あなたがこの方法で使用することができます:

private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

、各プロパティでは、このような使用のこと:

private bool someProperty= false; 
    public bool SomeProperty 
    { 
     get { return someProperty; } 
     set 
     { 
      if (someProperty!= value) 
      { 
       someProperty= value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
+0

私の問題は7-10行のコードすべてで、それぞれのプロパティに対してちょうど1または2を持つでしょう:) –

+0

@Keith 'PropertyChanged.Fody'ツールを使用してください。 – mechanic

0

私はそれでこれらの機能をすべての私のviewmodelsための基本クラスを使用します。

:あなたはその後、任意のサブクラスから、このようにそれを使用することができ
protected void RaisePropertyChanged(string propertyName) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

protected bool SetValue<T>(ref T backingField, T newValue, [CallerMemberName] string propertyName = "") 
{ 
    if (EqualityComparer<T>.Default.Equals(backingField, newValue)) 
    { 
     return false; 
    } 
    backingField = newValue; 
    RaisePropertyChanged(propertyName); 
    return true; 
} 

それは同じだった場合は210

private string _firstName; 

public string FirstName 
{ 
    get { return _firstName; } 
    set { SetValue(ref _firstName, value); } 
} 

SetValueは、あなたがチェーンに、より複雑なセッターのための任意の更なるアクションを必要とするだけの場合には、新しい値が以前の値と異なる場合trueを返し、falseます。