我有一个用[NotifyPropertyChanged]
标记的viewmodel。这些属性当然绑定在输入控件上,比如文本框。我需要知道,由于输入,模型的属性已经改变了。
我怎样才能抓住这个事件?
答案 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
。