Маршрутизируемые события в WPF - с использованием делегата Action

Я разрабатываю пользовательский элемент управления и хочу использовать перенаправленное событие. Я заметил, что есть два делегата - RoutedEventHandler и RoutedPropertyChangedEventHandler. Первый, который не передает никакой информации, а второй, который принимает старые и новые значения свойства, изменяется. Однако мне нужно передать только один фрагмент информации, поэтому я хочу получить эквивалент делегата Action. Есть что-нибудь предусмотрено? Могу ли я использовать делегат Action?

1 ответ

Решение

Создайте подкласс RoutedEventArgs для хранения ваших дополнительных данных и используйте EventHandler<T> с вашим классом args. Это будет преобразовано в RoutedEventHandler, а дополнительные данные будут доступны в ваших обработчиках.

Вы можете создать общий класс RoutedEventArgs, который содержит один параметр любого типа, но создание нового класса обычно облегчает чтение и модификацию кода для включения большего количества параметров в будущем.

public class FooEventArgs
    : RoutedEventArgs
{
    // Declare additional data to pass here
    public string Data { get; set; }
}

public class FooControl
    : UserControl
{
    public static readonly RoutedEvent FooEvent =
        EventManager.RegisterRoutedEvent("Foo", RoutingStrategy.Bubble, 
            typeof(EventHandler<FooEventArgs>), typeof(FooControl));

    public event EventHandler<FooEventArgs> Foo
    {
        add { AddHandler(FooEvent, value); }
        remove { RemoveHandler(FooEvent, value); }
    }

    protected void OnFoo()
    {
        base.RaiseEvent(new FooEventArgs()
        {
            RoutedEvent = FooEvent,
            // Supply the data here
            Data = "data",
        });
    }
}
Другие вопросы по тегам