2012-04-01 83 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是否可以覆蓋/添加一些代碼到int-class? – 2012-04-01 12:51:59

回答

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 2012-04-01 15:11:46

+0

@roqstr不,你不能從值類型繼承。 – 2012-04-01 15:46:52

+1

好吧thx無論如何,偉大的作品! – roqstr 2012-04-01 16:05:23

1

接近的唯一東西是INotifyPropertyChangedINotifyPropertyChanging接口。這些分別定義了事件。

但是,這些不會給你新的或舊的價值,只是它已經改變/改變。

您通常在屬性定義他們.. 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()僅僅是調用事件私有方法。