Как мне прикрепить свойство к пользовательскому событию? - PullRequest
3 голосов
/ 23 сентября 2010

У меня есть пользовательское событие, и я хочу прикрепить к нему свойство (подойдет строка). Что мне нужно изменить в моем коде:

    public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
        "ModelClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(InfoBox));

    // Provide CLR accessors for the event
    public event RoutedEventHandler FadeIn
    {
        add { AddHandler(ModelClickEvent, value); }
        remove { RemoveHandler(ModelClickEvent, value); }
    }

    // This method raises the Tap event
    void RaiseTapEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(InfoBox.FadeInEvent); 
        RaiseEvent(newEventArgs);
    }

Ответы [ 2 ]

8 голосов
/ 23 сентября 2010

Во-первых, вам нужно создать новый производный класс RoutedEventArgs, содержащий ваше новое свойство.Что-то вроде:

public class ModelClickEventArgs : RoutedEventArgs
{
    public string MyString { get; set; }
    public ModelClickEventArgs() : base() { }
    public ModelClickEventArgs(RoutedEvent routedEvent) : base(routedEvent) { }
    public ModelClickEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source) { }
}

Затем вам нужно будет создать делегата, который будет использовать ваши новые аргументы событий:

public delegate void ModelClickEventHandler(object sender, ModelClickEventArgs e);

После этого вам придется внести изменения в ваш кодвыше, чтобы он использовал эти новые объекты:

public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
        "ModelClick", RoutingStrategy.Bubble, typeof(ModelClickEventHandler), typeof(Window));

// Provide CLR accessors for the event
public event ModelClickEventHandler FadeIn
{
    add { AddHandler(ModelClickEvent, value); }
    remove { RemoveHandler(ModelClickEvent, value); }
}

// This method raises the Tap event
void RaiseTapEvent()
{
    ModelClickEventArgs newEventArgs = new ModelClickEventArgs();
    newEventArgs.MyString = "some string";
    RaiseEvent(newEventArgs);
}
2 голосов
/ 23 сентября 2010

Если вы имеете в виду, что вы хотите добавить свойство к объекту RoutedEventArgs, которое получают обработчики, тогда все, что вам нужно сделать, - это объявить класс, который наследуется от RoutedEventArgs и имеет свойство (-y / -ies) вы хотели бы добавить.

Это будет выглядеть примерно так:

public class ModelRoutedEventArgs : RoutedEventArgs
{
  public string ExtraMessage { get; set; }
  public ModelRoutedEventArgs(RoutedEvent routedEvent, string message) : base(routedEvent)
  {
    ExtraMessage = message;
  }
  // anything else you'd like to add can go here
}

Или вместо добавления перегрузки конструктора вы можете просто создать свой собственный класс RoutedEventArgsи установите свойство перед передачей его вызову RaiseEvent().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...