如何使用Postsharp捕捉房产变化?

时间:2014-11-04 11:10:14

标签: c# mvvm postsharp

我有一个用[NotifyPropertyChanged]标记的viewmodel。这些属性当然绑定在输入控件上,比如文本框。我需要知道,由于输入,模型的属性已经改变了。

我怎样才能抓住这个事件?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

实际上有“没有代码”,因为Postsharp做了很多努力,所以我不得不用标签声明我的班级:

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

我唯一能回答我的问题是,对于其他人来说,知道如何在没有代码的情况下从这种情况中获取事件可能会有用,因为postharp会编译时间。您可以使用reflexion运行时并附加您自己的事件处理程序。您可能认为,它杀死了Postsharp的目的,但是有些情况(比如我的/是我使用编写良好的父类派生的地方)你可能会发现它比调用类似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