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

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

1 Ответ

5 голосов
/ 23 августа 2010

Создайте подкласс 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",
        });
    }
}
...