2011-12-25 42 views
1

ビジネスオブジェクトの3つのプロパティにバインドされたWPFに3つのテキストボックスがあります。テキストボックスは、ユーザが3つの異なる長さを入力することを可能にする。自動的に計算されるプロパティのバインディングの更新

次に、3つの入力からの簡単な計算を表示する他のプロパティにバインドされた多数のテキストブロックを作成しました。次のようにこれらのプロパティの値は、各プロパティのgetメソッドで計算されています

public double Length1 { get; set } 
public double Length2 { get; set } 
public double Length3 { get; set } 
public double Result1 
{ 
    get { return Length1 - Length2 - Length3; } 
} 
public double Result2 
{ 
    get { return Length1 + Length2 + Length3; } 
} 

どのように私はLengths1,2または3に加えられた変更後結果1と結果2のバインディングを更新することができますか?

おかげ

答えて

3

あなたのViewModelはINotifyPropertyChangedのイベントをimnplementingされている場合は、(残念ながら)、それらの自動プロパティを捨てて、長さ1、長さ2またはLength3が変更されるたびPropertyChangedイベントを上げたいです。

PropertyChanged(this, new PropertyChangedEventArgs("Result1")); 

private double _length1; 
public double Length1 { 
    get { return _length1; } 
    set { 
     _length = value; 
     PropertyChanged(this, new PropertyChangedEventArgs("Result1")); 
     PropertyChanged(this, new PropertyChangedEventArgs("Result2")); 
     PropertyChanged(this, new PropertyChangedEventArgs("Length1")); 
    } 

しかし、これはかなり速い疲れますので、私は通常、ヘルパーメソッドを実装:私はジョンスキートの本から学んだ

void RaiseThese(params string[] properties){ 
    foreach(string prop in properties) 
     PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
} 

そして

public double Length1 { 
    get { return _length1; } 
    set { 
     _length = value; 
     RaiseThese("Result1", "Result2", "Length1"); 
    } 
+0

アダムに感謝、このようにしなければならないかもしれないと思った。デリゲートの使用は素晴らしいです。 –

2

使用INotifyPropertyChangedと長さ1、長さ2とLength3における結果1と結果2のためのイベントを発生させます。

private double _length1; 
public double Length1 
{ 
    get { return _length1; } 
    set 
    { 
     if (_length1 == value) return; 
     _length1 = value; 
     OnPropertyChanged("Length1"); 
     OnPropertyChanged("Result1"); 
     OnPropertyChanged("Result2"); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 
private void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

トリックを - あなたはそれらを避けることができますこのようなイベントを宣言して迷惑なヌルチェックを行う 'publicイベントPropertyChangedEventHandler PropertyChanged = delegate {};' –

+0

@Adamおかげさまで、ありがとうございました。これに関する多くのディスクがある。 [nullイベントハンドラのチェックを避ける](http://stackoverflow.com/a/9282/620360)または[イベント宣言に匿名の空の代理人を追加することには欠点がありますか?](http://stackoverflow.com/questions)/170907/is-there-a-downside-to-anonymous-empty-delegate-on-event-declaration) – LPL

関連する問題