Как отследить изменение свойства с помощью Postsharp?

1

У меня есть viewmodel, который помечен с помощью [NotifyPropertyChanged]. Свойства, конечно, связаны с элементами управления вводами, такими как текстовые поля. Мне нужно знать, что свойство модели было изменено из-за ввода.

Как я могу поймать это событие?

  • 1
    некоторый код поможет.
Теги:
mvvm
postsharp

2 ответа

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));
    }
}

Дополнительную информацию можно найти здесь.

  • 0
    Даже если у меня есть решение, я попробую ваше и приму в качестве ответа, если оно сработает, потому что оно выглядит намного чище, чем мое с отражением. Спасибо.
0

На самом деле не было "никакого кода", потому что 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню