У меня есть viewmodel, который помечен с помощью [NotifyPropertyChanged]
. Свойства, конечно, связаны с элементами управления вводами, такими как текстовые поля. Мне нужно знать, что свойство модели было изменено из-за ввода.
Как я могу поймать это событие?
Если класс, украшенный 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));
}
}
Дополнительную информацию можно найти здесь.
На самом деле не было "никакого кода", потому что Messageharp сделал тяжелую работу, поэтому мне пришлось объявить мой класс только с тегом:
[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
.