2012-04-01 7 views
2

整数値が変更されたときはいつでも反応したい。だから、独自のイベントハンドラを書く可能性はありますか?古い値と新しい値を取得する必要があります。なぜなら、リスト内のオブジェクトのいくつかのイベントを古い値のインデックスで参照解除し、これらのイベントを新しい値のインデックスを持つlistitemに参照する必要があるからです。値が変更されたイベントハンドラー

このような何か(実際には抽象):

value.Changed += new Eventhandler(valuechanged); 
private void valuechanged(object sender, eventargs e) 
{ 
    list[e.Oldvalue] -= some eventhandler; 
    list[e.newValue] += some eventhanlder; 
} 

感謝。

+0

を可能な重複:http://stackoverflow.com/questions/7677854/notifypropertychanged-event-where-event-args-c ontain-the-old-value –

答えて

8

あなたはこのような何か行うことができます。

class ValueChangedEventArgs : EventArgs 
{ 
    public readonly int LastValue; 
    public readonly int NewValue; 

    public ValueChangedEventArgs(int LastValue, int NewValue) 
    { 
     this.LastValue = LastValue; 
     this.NewValue = NewValue; 
    } 
} 

class Values 
{ 
    public Values(int InitialValue) 
    { 
      _value = InitialValue; 
    } 

    public event EventHandler<ValueChangedEventArgs> ValueChanged; 

    protected virtual void OnValueChanged(ValueChangedEventArgs e) 
    { 
      if(ValueChanged != null) 
       ValueChanged(this, e); 
    } 

    private int _value; 

    public int Value 
    { 
     get { return _value; } 
     set 
     { 
      int oldValue = _value; 
      _value = value; 
      OnValueChanged(new ValueChangedEventArgs(oldValue, _value)); 
     } 
    } 
} 

ですから、ここで(コンソールテスト)のようなあなたのクラスを使用することができます。

void Main() 
{ 
    Values test = new Values(10); 

    test.ValueChanged += _ValueChanged; 

    test.Value = 100; 
    test.Value = 1000; 
    test.Value = 2000; 
} 

void _ValueChanged(object sender, ValueChangedEventArgs e) 
{ 
    Console.WriteLine(e.LastValue.ToString()); 
    Console.WriteLine(e.NewValue.ToString()); 
} 

これを印刷します:

Last Value: 10 
New Value: 100 

Last Value: 100 
New Value: 1000 

Last Value: 1000 
New Value: 2000 
+0

int-classにいくつかのコードを上書きすることは可能ですか? – roqstr

+0

@roqstrいいえ、値の型から継承することはできません。とにかく、 –

+1

ok thx、素晴らしい作品! – roqstr

1

閉じることができるのは、INotifyPropertyChangedINotifyPropertyChangingのインターフェイスだけです。これらはそれぞれPropertyChanged & PropertyChangingイベントを定義します。

ただし、これらは変更または変更されただけで、新しい値または古い値を与えません。

あなたは一般的に..性質上それらを定義ALA:

private int _myInt; 
public int MyInt 
{ 
    get 
    { 
     return this._myInt; 
    } 

    set 
    { 
     if(_myInt == value) 
      return; 

     NotifyPropertyChanging("MyInt");  
     this._myInt = value; 
     NotifyPropertyChanged("MyInt"); 
     } 
    } 
} 

注:NotifyPropertyChanging() & NotifyPropertyChanged()がイベントを起動するだけのプライベートメソッドです。

関連する問題