2015-12-21 62 views
0

在我的模型中,我有屬性,我想執行一些額外的代碼,當屬性被更改。我想將新值和屬性名稱添加到我的數據庫。我也想保留當前報警列表(值等於true)。覆蓋RaisePropertyChanged來執行附加代碼

public Boolean ActionAlarmLowLow 
    { 
     get 
     { 
      return _ActionAlarmLowLow; 
     } 
     set 
     { 
      if (value != this._ActionAlarmLowLow) 
      { 
       Boolean oldValue = _ActionAlarmLowLow; 
       _ActionAlarmLowLow = value; 
       RaisePropertyChanged("ActionAlarmLowLow", oldValue, value, true); 
      } 
     } 
    } 

我該如何正確地做到這一點? 我想知道如果我要補充的兩行代碼的財產:

DB.Log.addLogItem("ActionAlarmLowLow", value); 
AlarmList.UpdateItem("ActionAlarmLowLow", value); 

或者如果我能以某種方式延長/覆蓋RaisePropertyChanged和特定的屬性做一些額外的東西在其他地方。 I.e打電話叫做

RaisePropertyChangedWriteToDbUpdateAlarmList();` 
+0

是什麼阻止你在RaisePropertyChanged之後觸發你自己的事件?只需在那裏再次打電話給您自己的活動,並在那裏處理數據庫電話......或者,您可能正在尋找什麼? http://stackoverflow.com/questions/15246108/how-can-i-raisepropertychanged-on-property-change – MaxOvrdrv

+0

它看起來像你已經知道答案。如果它是一個單獨的屬性,只需在它的setter中添加這些行。如果您需要多個屬性,則創建一個幫助器方法,記錄,更新和調用'RaisePropertyChanged'。 –

+0

這是需要此功能的多個屬性。每個代碼有一兩行額外的代碼似乎是額外的工作。這就是爲什麼即時通訊要求如何實現自定義RaisePropertyChangedWriteToDbUpdateAlarmList();'這可以同時。我認爲傑根已經回答了有關力學的問題。 – Snovva1

回答

0

是的,它很簡單,只需要用INotifyPropertyChanged創建一個基類並調用任何你想要的內部。

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

    protected virtual void OnPropertyChanged<T>(Expression<Func<T>> expression) 
    { 
     var memberExpression = (MemberExpression) expression.Body; 
     var propertyName = memberExpression.Member.Name; 

     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      // Do your common actions here, before property change notification is fired 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
      // Do your common actions here, after property change notification is fired 
     } 
    } 
} 

public class MyClass : NotifyPropertyChangedBase 
{ 
    public Boolean ActionAlarmLowLow 
    { 
     get 
     { 
      return _ActionAlarmLowLow; 
     } 
     set 
     { 
      if (value != this._ActionAlarmLowLow) 
      { 
       _ActionAlarmLowLow = value; 
       OnPropertyChanged(() => this.ActionAlarmLowLow); 
      } 
     } 
    } 
} 
+0

謝謝你的回答。你認爲我可以將它與我已經實現的MVVM光源「ViewModelBase」結合嗎? 公用抽象類NotifyPropertyChangedBase:ViewModelBase而不是INotifyPropertyChanged? – Snovva1

+0

要結合MVVM Light,看看這個答案http://stackoverflow.com/questions/13461278/mvvm-light-toolkit-how-to-use-propertychangedmessage – Jegan