2014-11-04 71 views
1

我有一個標籤爲[NotifyPropertyChanged]的視圖模型。這些屬性當然是綁定在輸入控件上的,比如文本框。我需要知道,模型的屬性因輸入而改變。如何使用Postsharp捕捉屬性更改?

我該如何抓住這個事件?

+1

有些代碼會有所幫助。 – thumbmunkeys 2014-11-04 11:59:11

回答

1

如果NotifyPropertyChanged裝飾類直接實現INotifyPropertyChanged,然後PostSharp要求有與簽名的方法:

void OnPropertyChanged(string propertyName) 

這種方法具有明確提高PropertyChanged事件。工作示例可能如下所示:

[NotifyPropertyChanged] 
public class OsModel : INotifyPropertyChanged 
{ 
    public int P1 { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

可以找到其他信息here

+0

即使我有一個解決方案,我會嘗試你的,並接受作爲答案,因爲它看起來更清潔,然後我的反思。謝謝。 – 2014-11-05 12:12:32

0

其實沒有「代碼」,因爲Postsharp做了艱苦的工作,所以我不得不宣佈我的課只能用標籤:

[NotifyPropertyChanged] 
    public class OsModell // : ... interfaces only 
    { 
    ... 
    } 

只爲我回答我的問題是,它可能是有用的人也知道,當你沒有代碼時,如何從這種情況中獲得事件,因爲postharp是編譯時。您可以使用反射運行時並附加您自己的事件處理程序。你可能會認爲,它殺死了爲此發生Postharp的目的,但是有些情況下(像我的是在哪裏使用編寫良好的父類來源),您可能會發現它更有用,然後調用OnPropertyChanged類似的方法寫你自己的自我。

所以..你可以只附加這個運行時,因爲在設計時你沒有代碼,因爲PS做了很多工作。你可以這樣做:

[NotifyPropertyChanged] 
    public class OsModell //... 
    { 
    public OsModell() 
    { 
     //... 

     #region feliratkozás helyi propertychangedre úgy, hogy még dizájn alatt nem létezik 
     //forrás: http://msdn.microsoft.com/en-us/library/ms228976(v=vs.100).aspx 
     { 
     EventInfo feliratkozasiSegedEventInfo = this.GetType().GetEvent("PropertyChanged"); 
     Type propertyChangedEventhandlerTipusa = feliratkozasiSegedEventInfo.EventHandlerType; 
     MethodInfo segedAhhozAmitMajdAdattartalomValtozasahozCsatolok = this.GetType().GetMethod("megvaltozottAzAdattartalom", BindingFlags.NonPublic | BindingFlags.Instance); 
     Delegate d = Delegate.CreateDelegate(propertyChangedEventhandlerTipusa, this, segedAhhozAmitMajdAdattartalomValtozasahozCsatolok); 
     MethodInfo addHandler = feliratkozasiSegedEventInfo.GetAddMethod(); 
     Object[] addHandlerArgs = { d }; 
     addHandler.Invoke(this, addHandlerArgs); 
     } 
     #endregion 
    } 

    protected void megvaltozottAzAdattartalom(Object sender, EventArgs e) 
    { 
     //... 
    } 

你可能會發現代碼塊中的鏈接有用。 如果您從此課程派生,則應該使用protected,如果不是,也可以使用private